交换排序之快速排序

来源:互联网 发布:数组 高级 excel 编辑:程序博客网 时间:2024/05/09 16:54

今天大鹏哥跟大家一起学习下交换排序中的快速排序。

快速排序是对冒泡排序的一种改进。它的基本思想是,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到真个序列有序。

快速排序基本步骤:

         Step1、定义两个变量low和high,他们的初值分别为low和high,此外还有一个变量pivotkey。

         Step2、首先从high所指位置向前搜索找到第一个关键字小于pivotkey的记录和pivotkey交换。

         Step3、从low所指位置向后搜索,找到第一个关键字大鱼pivotkey的记录和pivotkey交换。

         Step4、重复以上步骤直到low=high为止。

 

待排序列:49   38   65   97   76   13   27  49

1、附设low和high以及设枢轴记录的关键字为pivotkey:

                    49   38   65   97  76   13   27   49

                     ↑(low)                               ↑(high)

                    ↑(pivotkey)

2、从high所指位置向前搜索,找到第一个小于pivotkey的记录(此处为27)和枢轴记录互相交换:

                    27   38   65   97  76   13   49   49

                     ↑(low)                               ↑(high)

                                                            ↑(pivotkey)

3、从low所指位置向后搜索,找到第一个大于pivotkey的记录(此处为65)和枢轴记录互相交换:

                   27   38   49  97   76   13   65   49

                              ↑(low)              ↑(high)

                              ↑(pivotkey)

4、重复2、3步直至low=high为止。

                 27   38   13   97  76   49   65   49

                           ↑(low)         ↑(high)

                                            ↑(pivotkey)

                27   38   13   49  76   97   65   49

                                ↑(low) ↑(high)

                                ↑(pivotkey)

                 27   38   13   49  76   97   65   49

                                ↑(low=high)

                                ↑(pivotkey)

上面给出的是一趟快排过程,整个快排过程可递归进行,上述操作完成后,再分别对两个子序列进行快速排序。

Java实现如下:

        

public class QuickSort {

 

    public static void main(String[] args) {

       // TODO Auto-generatedmethod stub

       int[] a={49,38,65,97,76,13,27,49};

       int pivotloc,low=0,high=a.length-1;

       System.out.print("排序前:");

       for(int x:a){

           System.out.print(x+",");

       }

       if(low<high){

           pivotloc = quickSort(a,low,high);

           quickSort(a,low,pivotloc-1);

           quickSort(a,pivotloc+1,high);

       }

       System.out.print("排序后:");

       for(int x:a){

           System.out.print(x+",");

       }

    }

 

    private static int quickSort(int[] a,int low, int high) {

       int pivotkey=a[low];

       while(low<high){

           while(low<high&&a[high]>=pivotkey)

              high--;

           a[low]=a[high];

           while(low<high&&a[low]<=pivotkey)

              low++;

           a[high]=a[low];

       }

       a[low]=pivotkey;

       return low;

    }

 

}

快速排序的时间复杂度为O(NlogN)。

1 0
原创粉丝点击