Java 快速排序详解

1.快速排序有三种形式:双指针型,挖坑型,游标型,可能具体叫法不太一样。这里介绍的是本人认为很简单的 双指针型。

   

 快速排序的基本思想:

         通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则分别对这两部分继续进行排序,直到整个序列有序。

       先看一下这幅图:

把整个序列看做一个数组,把第零个位置看做中轴,和最后一个比,如果比它小交换,比它大不做任何处理;交换了以后再和小的那端比,比它小不交换,比他大交换。这样循环往复,一趟排序完成,左边就是比中轴小的,右边就是比中轴大的,然后再用分治法,分别对这两个独立的数组进行排序。

下面请看代码:

 public static void quickSort(int[] a,int start,int end) {    
       int top =start;//记录开始位置和变化
       int under = end;//记录结束位置和变化
       int temp = a[start];
       while(under>top) {
           while (under>top && a[under]>temp) {//从后往前比,如果有比关键词小的,交换位置,否则往下比
               under--;
        }
           if (a[under]<temp) {
            int x =a[under];
            a[under] =a[top];
            a[top] = x;
        }
           while (under>top && a[top]<temp) {//从前往后比,如果有比关键词大的交换位置,否则忘后比
            top++;
        }
           if (a[top]>temp) {
            int x =a[top];
            a[top] =a[under];
            a[under] = x;
//此时第一次循环比较结束,关键值的位置已经确定了。左边的值都比关键值小,右边的值都比关键值大,但是两边的顺序还有可能是不一样的,进行下面的递归调用
        }
           
        if (top>start) {
               quickSort(a,start,top-1);//左边序列。第一个索引位置到关键值索引-1
        }if (under<end) {
            quickSort(a, under+1, end);//右边序列。从关键值索引+1到最后一个
        }
       }
       
   }
原文:https://blog.csdn.net/qq_33188563/article/details/82469022 
 

发布了0 篇原创文章 · 获赞 0 · 访问量 1358

猜你喜欢

转载自blog.csdn.net/chnglv/article/details/89479079
今日推荐