快速排序的认识

认识快速排序
概述: 快速排序是冒泡排序的升级,都属于交换类排序
简介:
快速排序是一种非常高效的排序算法。
它的实现,增大了记录的比较和移动的距离。将关键字较大的记录从前面直接移动到后面,关键字较小的记录从后面直接移动到前面,从而减少总的比较次数和移动次数,同时采用“分而治之”的思想。把大的拆分为小的,小的拆分为更小的。
操作:
对于给定的一组记录,选择一个基准元素,通常选择第一个元素和最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分,直到序列中所有的记录有序为止。
示例:
排序 4为基准
4 5 6 7 8 9 3 5

第一次(注意,开始比较的时候,方位都是从最后一个元素开始,当发起交换的时候,比较需要改变方位。)

4 5 6 7 8 9 3 5 (5比4大,移动指针,序列不变)
||
4 5 6 7 8 9 3 5 (3 比4小,3发起交换,且对面移动指针)
||
3 5 6 7 8 9 4 5 (5比4 大,5发起交换,且对面移动指针)
||
3 4 6 7 8 9 5 5 (9 比4大,移动指针,序列不变)
||
3 4 6 7 8 9 5 5 (8比4大,移动指针,序列不变)
||
3 4 6 7 8 9 5 5 (7比4大,移动指针,序列不变)
||
3 4 6 7 8 9 5 5 (6比4大,移动指针,序列不变)
第一次结束
分为两部分i-1,i+1( 4所在的数组序号为1,所以i=1)
分为两部分{3}和{6 7 8 9 5 5}
{3 4}不必排序
下面需要第二次排序,排{6 7 8 9 5 5},以 6为基准
发起第二次排序
6 7 8 9 5 5( 5比6小,5 发起交换,对面移动指针)
||
5 7 8 9 5 6 ( 7比6大,7 发起交换,对面移动指针)
||
5 6 8 9 5 7 ( 5 比6 小,5发起交换,对面移动指针)
||
5 5 8 9 6 7 (8比6 大,8发起交换,对面移动指针)
||
5 5 6 9 8 7 (9比6 大,移动指针)
||
5 5 6 9 8 7
第二次排序结束
发起第三次排序
分为两部分 {5 5 }和{ 9 8 7}
{5 5}不必排序
下面排序{ 9 8 7 } ,以9为基准
9 8 7 (7 小于9 ,7发起交换,对面移动指针)
||
7 8 9
(排序结束,据此,可以很快写出代码)

代码:
    public static void resultK(int[] a,int low,int high){
        int i=low;
        int j=high;
        if(low>=high){
            return ;
        }
        int index=a[i];
        int temp=0;
        while (i < j) {
            while(j>i&&a[j]>=index){//先从后面开始算
                j--;
            }
            if(i<j){
                temp=a[i];
                a[i++]=a[j];//先将a[j]的值赋给a[i],然后i自增1。
                a[j]=temp;
            }
            while(i<j&&a[i]<index){
                i++;
            }
            if(i<j){
                temp=a[j];
                a[j--]=a[i];
                a[i]=temp;
            }
        }  
        resultK(a,low,i-1);
        resultK(a,i+1,high);
    }
测试以及结果:

  int[] a= {4, 5, 6, 7, 8, 9, 3, 5};
         paiXu.resultK(a,0,a.length-1);
         System.out.println(Arrays.toString(a));

   打印:[3, 4, 5, 5, 6, 7, 8, 9]

猜你喜欢

转载自blog.csdn.net/weixin_36087172/article/details/75648473