圖解快速排序 易懂


快速排序是冒泡排序的改進版,也是最好的一種內排序,在很多面試題中都會出現,也是作為程序員必須掌握的一種排序方法。

思想:1.在待排序的元素任取一個元素作為基准(通常選第一個元素,但最的選擇方法是從待排序元素中隨機選取一個作為基准),稱為基准元素;

       2.將待排序的元素進行分區,比基准元素大的元素放在它的右邊,比其小的放在它的左邊;

       3.對左右兩個分區重復以上步驟直到所有元素都是有序的。

所以我是把快速排序聯想成東拆西補或西拆東補,一邊拆一邊補,直到所有元素達到有序狀態。

下面再看看示圖理解下吧:

                                  

 

                                  

6.對元素5兩邊的元素也重復以上操作,直到元素達到有序狀態。

算法實現:

public class QuickSort {

    public static void quickSort(int arr[],int _left,int _right){
        int left = _left;
        int right = _right;
        int temp = 0;
        if(left <= right){   //待排序的元素至少有兩個的情況
            temp = arr[left];  //待排序的第一個元素作為基准元素
            while(left != right){   //從左右兩邊交替掃描,直到left = right
while(right > left && arr[right] >= temp) right --; //從右往左掃描,找到第一個比基准元素小的元素 arr[left] = arr[right]; //找到這種元素arr[right]后與arr[left]交換
while(left < right && arr[left] <= temp) left ++; //從左往右掃描,找到第一個比基准元素大的元素 arr[right] = arr[left]; //找到這種元素arr[left]后,與arr[right]交換
} arr[right] = temp; //基准元素歸位 quickSort(arr,_left,left-1); //對基准元素左邊的元素進行遞歸排序 quickSort(arr, right+1,_right); //對基准元素右邊的進行遞歸排序 } } public static void main(String[] args) { int array[] = {10,5,3,1,7,2,8}; System.out.println("排序之前:"); for(int element : array){ System.out.print(element+" "); } quickSort(array,0,array.length-1);
System.out.println("\n排序之后:"); for(int element : array){ System.out.print(element+" "); } } }

排序結果:

排序之前:
10 5 3 1 7 2 8 
排序之后:
1 2 3 5 7 8 10 

算法分析:1.當分區選取的基准元素為待排序元素中的最大或最小值時,為最壞的情況,時間復雜度和直接插入排序的一樣,移動次數達到最大值

                  Cmax = 1+2+...+(n-1) = n*(n-1)/2 = O(n2) 此時最好時間復雜為O(n2

              2.當分區選取的基准元素為待排序元素中的"中值",為最好的情況,時間復雜度為O(nlog2n)。

              3.快速排序的空間復雜度為O(log2n). 

              4.當待排序元素類似[6,1,3,7,3]且基准元素為6時,經過分區,形成[1,3,3,6,7],兩個3的相對位置發生了改變,所是快速排序是一種不穩定排序。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM