快速排序
分为双边循环法和单边循环法,先来双边循环法,双边循环法是使用双指针,首先,选定基准元素pivot,并且设置两个指针left和right,指向数列的最左和最右两个元素。接下来进行第1次循环,从right指针开始,让指针所指向的元素和基准元素做比较。如果大于或等于pivot,则指针向左移动;如果小于pivot,则right指针停止移动,切换到left指针。轮到left指针行动,让指针所指向的元素和基准元素做比较。如果小于或等于pivot,则指针向右移动;如果大于pivot,则left指针停止移动。然后交换两个数据,完成一次循环,移动到重合时,让重合点和基准元素进行交换,完成一轮.
这是交换代码

private static int partition(int[] arr, int startIndex, int endIndex) {
        // 取第一个位置的元素作为基准元素(也可以选择随机位置)
        int pivot = arr[startIndex];
        int left = startIndex;左指针
        int right = endIndex;右指针

while( left != right) {
            //控制right指针比较并左移
            while(left<right && arr[right] > pivot){
                right--;
            }
            //控制left指针比较并右移
            while( left<right && arr[left] <= pivot) {
                left++;
            }
            //交换left和right指向的元素
            if(left<right) {
                int p = arr[left];
                arr[left] = arr[right];
                arr[right] = p;
            }
        }
        //pivot和指针重合点交换
        arr[startIndex] = arr[left];
        arr[left] = pivot;
        return left;
    }

单边循环法,开始和双边循环法相似,首先选定基准元素pivot。同时,设置一个mark指针指向数列起始位置,这个mark指针代表小于基准元素的区域边界。
接下来,从基准元素的下一个位置开始遍历数组。如果遍历到的元素大于基准元素,就继续往后遍历。如果遍历到的元素小于基准元素,则需要做两件事:第一,把mark指针右移1位,因为小于pivot的区域边界增大了1;第二,让最新遍历到的元素和mark指针所在位置的元素交换位置,因为最新遍历的元素归属于小于pivot的区域。
这是交换代码

private static int partitionV2(int[] arr, int startIndex, int endIndex) {
        // 取第一个位置的元素作为基准元素(也可以选择随机位置)
        int pivot = arr[startIndex];
        int mark = startIndex;

for(int i=startIndex+1; i<=endIndex; i++){
            if(arr[i]<pivot){
                mark ++;
                int p = arr[mark];
                arr[mark] = arr[i];
                arr[i] = p;
            }
        }

不管用哪种方法,递归的方法都是一样的

public static void quickSort(int[] arr, int startIndex, int endIndex) {
    // 递归结束条件:startIndex大等于endIndex的时候
    if (startIndex >= endIndex) {
        return;
    }
    // 得到基准元素位置
    int pivotIndex = partition(arr, startIndex, endIndex);
    // 根据基准元素,分成两部分递归排序
    quickSort(arr, startIndex, pivotIndex - 1);
    quickSort(arr, pivotIndex + 1, endIndex);
}

看一下实现的总代码吧

package sort;import java.util.Arrays;public class Quicksort {public static void quickSort(int[] arr, int startIndex, int endIndex) {// 递归结束条件:startIndex大等于endIndex的时候if (startIndex >= endIndex) {return;}// 得到基准元素位置int pivotIndex = partition(arr, startIndex, endIndex);// 根据基准元素,分成两部分递归排序quickSort(arr, startIndex, pivotIndex - 1);quickSort(arr, pivotIndex + 1, endIndex);
}/*** 分治(双边循环法)* @param arr     待交换的数组* @param startIndex    起始下标* @param endIndex    结束下标*/private static int partition(int[] arr, int startIndex, int endIndex) {// 取第一个位置的元素作为基准元素(也可以选择随机位置)int pivot = arr[startIndex];int left = startIndex;int right = endIndex;while( left != right) {//控制right指针比较并左移while(left<right && arr[right] > pivot){right--;}//控制left指针比较并右移while( left<right && arr[left] <= pivot) {left++;}//交换left和right指向的元素if(left<right) {int p = arr[left];arr[left] = arr[right];arr[right] = p;}}//pivot和指针重合点交换arr[startIndex] = arr[left];arr[left] = pivot;return left;}/*** 分治(单边循环法)* @param arr     待交换的数组* @param startIndex    起始下标* @param endIndex    结束下标*/private static int partitionV2(int[] arr, int startIndex, int endIndex) {// 取第一个位置的元素作为基准元素(也可以选择随机位置)int pivot = arr[startIndex];int mark = startIndex;for(int i=startIndex+1; i<=endIndex; i++){if(arr[i]<pivot){mark ++;int p = arr[mark];arr[mark] = arr[i];arr[i] = p;}}arr[startIndex] = arr[mark];arr[mark] = pivot;return mark;}public static void main(String[] args) {int[] arr = new int[] {4,4,6,5,3,2,8,1};quickSort(arr, 0, arr.length-1);System.out.println(Arrays.toString(arr));}}

JAVA快速排序递归算法相关推荐

  1. java快速排序算法_JAVA版排序算法之快速排序示例

    本文实例讲述了JAVA快速排序实现方法.分享给大家供大家参考,具体如下: package com.ethan.sort.java; import java.util.Arrays; import ja ...

  2. java实现递归算法_如何在Java中实现二进制搜索算法而无需递归

    java实现递归算法 by javinpaul 由javinpaul 流行的二进制搜索算法的迭代实现,用于在排序数组中查找元素. (An Iterative implementation of the ...

  3. java 快速排序 递归_Java递归快速入门

    java 快速排序 递归 The function calls itself until someone stops it. 该函数将自行调用,直到有人停止它为止. Recursion can fee ...

  4. JAVA快速排序算法实现

    JAVA快速排序算法实现 private static void quickSort(int[] arr, int start, int end) {if(start < end) {int b ...

  5. Java 快速排序,递归排序算法

    2.4 快速排序 递归算法:递归就是指方法中调用方法本身的现象. 递归注意事项:递归一定要有出口,否则会有栈内存溢出.出口就是要有停止递归的时候. 递归的两个核心 1.找出口 2.找规律 方法内部再次 ...

  6. 解读:什么是Java的递归算法?

    Java可以说是使用率非常高的一门编程语言了,在21世纪的今天Java绝对可以说的上是最热门的行业了.Java行业也被誉为IT行业的中流砥柱,是运用范围最为广泛的语言.今天小千就来和大家聊聊什么是Ja ...

  7. XDOJ 363 输出快速排序递归算法隐含递归树的后序遍历序列 AC

    像我这样的菜鸡也没有什么能输出的,好像我写题解也不算输出. 最近期末了,写数据结构实验的时候,这个题写了挺久的,搞出来记录一下. 输出快速排序递归算法隐含递归树的后序遍历序列 描述: 快速排序递归算法 ...

  8. JAVA——快速排序(详细)

    JAVA快速排序的实现 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等 ...

  9. java快速排序,优化

    java快速排序优化 研究java快速排序ing,目前希望做到,尽可能少的循环.交换.(求指点) (话说回来是判断连个值大小快,还是交换两个值快.我是凭感觉,认为判断连个大小快,所以当前版本判断比较多 ...

最新文章

  1. [转载] 七龙珠第一部——第004话 掳人的妖怪——乌龙
  2. JavaScript open() 函数
  3. ViewModelBase ObservableObject
  4. 网站福音 如何免费获得HTTPS认证服务?
  5. android触摸屏idc,Android触摸屏IDC
  6. 【jQuery Demo】图片由下至上逐渐显示
  7. selenium 定位方式2
  8. ❤️《小黄鸭调试法》程序员必备技能!!!❤️
  9. (转)IBM AIX系统安装
  10. 搭建开发环境之串口线的选择
  11. c语言考试题库大一下学期基础,c语言考试题(全国c语言二级考试题库)
  12. 时区相关-这一篇全了解
  13. 微信连wifi3.1总结
  14. 解决No thread-bound request found: Are you referring to request attributes outside of an actual web...
  15. Springboot整合liqubase
  16. 既然都有了NS,何不再入一个喷喷(Splatoon 2)【下】
  17. latex参考文献太长,换行处理
  18. 客制化键盘编程_客制化键盘QMK固件入门-修改keyboard和keymap
  19. 农业无人机的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  20. 率土之滨服务器进备战区维护多久,备战区完全解读

热门文章

  1. 快速排序(QuickSort)算法介绍
  2. 苹果mp3软件_音频格式转换软件
  3. i219v微星 驱动_Windows Server 2019 安装 Intel I219V 网卡驱动
  4. SkinLoad程序界面换肤工具
  5. 西南财经大学本科毕业论文答辩PPT模板
  6. SaaS软件有未来吗?SaaS是如何为企业带来经济效益的?
  7. 开咖啡店前必学知识,SOE咖啡是什么,和拼配豆比哪个更好?
  8. 理解 与 计算 物联网产品的电池使用寿命
  9. java销售管理系统_图书销售管理系统Java源代码
  10. 2016年终总结,新的一年新的开始