博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
快速排序学习
阅读量:3957 次
发布时间:2019-05-24

本文共 3113 字,大约阅读时间需要 10 分钟。

 

一,思想:

思想:

       1,找出标准值:取要进行递归排序的数组片段的最左边的数; 
        2,开始循环查找:(循环条件,左游标<右游标)
            2.1,当右边的数大于标准值时,右游标左移;
            2.2,当右边的数小于标准值时,用右边的数替换掉左边游标对应的数值; 
                   PS:第一次替换时其实替换掉的此时的左边的数就是标准值;
            2.3,当左边的数小于标准值时,左游标右移;
            2.4,当左边的数大于标准值时,用左边的数替换掉右边游标对应的数值;
        3,最后,当左右游标重合时,跳出了循环,此时用标准值替换掉左右游标重合时的数;
        4,此时,标准值左边的数都小于标准值,标准值右边的数都大于标准值,开始递归,(递归出口为:进行递归的数组片段起码有两个数,不然当数组只有一个数的时候就不需要进行排序了:即,数组最左边的数的索引 < 数组最右边的数的索引);
           4.1,左半边递归:最左边的数是 数组片段的最左边的下标索引,最右边的数是 左游标;
           4.2,右半边递归:最左边的数是 右游标+1,最右边的数是 数组片段的最右边的下标索引;

 

二,代码分析:

/**     * @param arr:要进行递归排序的数组     * 因为递归的时候,是对数组中不同的每一块进行递归,所以要告诉是数组中的哪一块,所以有leftIndex和rightIndex;     * @param leftIndex:要进行递归排序的数组 的最左边的数的下标索引;     * @param rightIndex:要进行递归排序的数组 的最右边的数的下标索引;     * @return*/public static int[] kuaipai(int arr[], int leftIndex, int rightIndex) {        //1,我们通常以该数组片段的第一个数为标准值:        int standard = arr[leftIndex];        //2,设置左游标,右游标;        int leftYouBiao = leftIndex; //左游标一开始肯定是从数组片段的最左边开始;        int rightYouBiao = rightIndex; //右游标一开始肯定是从数组片段的最右边开始;        //3,开始循环查找:         // 搞一个循环,左游标循环的找比标准值大的数,右游标循环的找比标准值小的数,低的往高的走,高的往低的走,总有一个结束条件吧,循环的结束条件是,左游标是否是小于右游标的,(如果它们两个重合了,就是相等了嘛,就不需要再继续挪动游标了)。所以循环的结束条件肯定是左右游标重合了,就不用再接着查找了;        while (leftYouBiao < rightYouBiao) {            //4,当右边的数一直大于等于标准值时,右游标一直左移:            //右游标左移也不能过猛,不能小于了左游标:rightYouBiao>leftYouBiao            while (rightYouBiao>leftYouBiao && arr[rightYouBiao] >= standard) {                rightYouBiao--;            }            //5,当右边的数小于标准值了,此时,用右边的数替换掉此时的左边的数;            if (arr[rightYouBiao] < standard) {                arr[leftYouBiao] = arr[rightYouBiao];            }            //6,当左边的数一直小于等于标准值时,左游标一直右移:            //   左游标右移也不能过猛,不能大于了右游标:leftYouBiao
standard) { arr[rightYouBiao] = arr[leftYouBiao]; } } //8,当左右游标重合了,此时leftYouBiao == rightYouBiao,则出了while循环; // 此时,将标准值再去替换了此时左右游标所在的那个数值: // 直至左右游标重合之后,即指向同一个数字之后,用标准值替换掉重合的这个数字,因为不替换的话,这整个数组的元素就变了; arr[leftYouBiao] = standard; //这里也可以换成 arr[rightYouBiao]也行,一样的; //9,此时,标准值左边的数小于标准值,标准值右边的数大于标准值,开始递归: // 递归必须要有递归出口:即要进行排序的数组片段起码要有两个数,即数组的最左边的下标索引

 

三,代码:

来一个清爽版的,自己试着理解这段代码:

/**     * @param arr:要进行递归排序的数组     * @param leftIndex:要进行递归排序的数组 的最左边的数的下标索引;     * @param rightIndex:要进行递归排序的数组 的最右边的数的下标索引;     * @return*/public static int[] kuaipai(int arr[], int leftIndex, int rightIndex) {        int standard = arr[leftIndex];            int leftYouBiao = leftIndex;         int rightYouBiao = rightIndex;         while (leftYouBiao < rightYouBiao) {            while (rightYouBiao>leftYouBiao && arr[rightYouBiao] >= standard) {                rightYouBiao--;            }            if (arr[rightYouBiao] < standard) {                arr[leftYouBiao] = arr[rightYouBiao];            }                        while (leftYouBiao
standard) { arr[rightYouBiao] = arr[leftYouBiao]; } } arr[leftYouBiao] = standard; if (leftIndex < leftYouBiao) { kuaiPai(arr, leftIndex, leftYouBiao); } if (rightYouBiao + 1 < rightIndex) { kuaiPai(arr, rightYouBiao + 1, rightIndex); } return arr;}

 

 

转载地址:http://eytzi.baihongyu.com/

你可能感兴趣的文章
Linux 线程操作函数技能总结
查看>>
Linux git 常用命令
查看>>
线程池原理及创建并C++实现
查看>>
Mysql命令教程大全
查看>>
文档类程序各个类之间的相互访问关系
查看>>
sql server中count(*),count(col),count(1)的区别
查看>>
多年来,STL容器的使用总结!
查看>>
switch()case:语句的优化
查看>>
C语言各种数据类型在系统中占的字节和取值范围
查看>>
MultiThreadDownLoad
查看>>
类结构定义
查看>>
Java中Set转List 和 TreeMap中实现自定义类作为key值
查看>>
SQL中的CONSTRAINT用法总结
查看>>
Windows下关于多线程类 CSemaphore,CMutex,CCriticalSection,CEvent,信号量CSemaphore的使用介绍
查看>>
图像处理基本算法(汇总)以及实现
查看>>
C++编程获取本机网卡信息 本机IP 包括Windows和Linux
查看>>
socket通信网络模型 ——Epoll、IOCP模型详解以及与select、kqueue等常见模型的区别特点
查看>>
HTTP协议/RTP/RTSP协议/RTMP协议的区别
查看>>
23种设计模式详解及C++实现
查看>>
C++连接CTP接口实现简单量化交易
查看>>