交換排序之快速排序

今天大鵬哥跟大家一起學習下交換排序中的快速排序。

快速排序是對冒泡排序的一種改進。它的基本思想是,通過一趟排序將待排記錄分割成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分的關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到真個序列有序。

快速排序基本步驟:

         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)。

發佈了56 篇原創文章 · 獲贊 2 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章