1. 程式人生 > >快速排序的遞歸和非遞歸

快速排序的遞歸和非遞歸

tails 三次 sort 大於 速度 amp 定義 二次 進行

快速排序,顧名思義,是一種速度快,效率高的排序算法。

  • 快排原理:
在要排的數(比如數組A)中選擇一個中心值key(比如A[0]),通過一趟排序將數組A分成兩部分,其中以key為中心,key右邊都比key大,key左邊的都key小,然後對這兩部分分別重復這個過程,直到整個有序。 整個快排的過程就簡化為了一趟排序的過程,然後遞歸調用就行了。 一趟排序的方法:

  1定義i=0,j=A.lenght-1,i為第一個數的下標,j為最後一個數下標

  2從數組的最後一個數Aj從右往左找,找到第一小於key的數,記為Aj;

  3從數組的第一個數Ai 從左往右找,找到第一個大於key的數,記為Ai;

  4交換Ai 和Aj

  5重復這個過程,直到 i=j   6調整key的位置,把A[i] 和key交換 假設要排的數組為:A[8] ={ 5 2 8 9 2 3 4 9 }: 選擇 key = 5, 開始時 i=0,j=7 index 0 1 2 3 4 5 6 7 開始: 5 2 8 9 2 3 4 9 i j 第一次找 5 2 8 9 2 3 4 9 i j 交換: 5 2 4 9 2 3 8 9 i j 第二次找 5 2 4 9 2 3 8 9 i j 交換: 5 2 4 3 2 9 8 9 i j 第三次找 5 2 4 3 2 9 8 9 ij 調整key: 2 5 4 3 5 9 8 9 ij

--------------------- 本文來自 Yexiaofen 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/Yexiaofen/article/details/78018204?utm_source=copy

遞歸:

 void quick_sort(int m[],int l,int r){
        int i=l,j=r;
        int x=m[i];
        if(l<r){
            while (i<j) {//一次不行,進行多次
                while (i < j && m[j] >= x)//從右向左,找比x小的
                    j--;
                if (i < j) {
                    m[i] = m[j];
                    i
++; } while (i < j && m[i] <= x)//從左向右,找比x大的 i++; if (i < j) { m[j] = m[i]; j--; } m[i] = x; } quick_sort(m,l,i-1);//遞歸調用 quick_sort(m,i+1,r); } }

快速排序的遞歸和非遞歸