1. 程式人生 > >教你學習快速排序算法-程序員必備哦

教你學習快速排序算法-程序員必備哦

測試 upload 一個 sort 中間 ogr ges 教你 sta

支持原文:https://tryenough.com/arithmetic-quitsort

舉個例子

排序這個序列:6 1 2 7 9 3 4 5 10 8

  • 步驟1:選擇一個基準數作為對比的開始值,這裏選擇第一個數6:
  • 步驟2、先從右往左找一個小於 6 的數,再從左往右找一個大於 6 的數。

技術分享圖片

  • 步驟3、然後交換他們

技術分享圖片

變成這樣子:

技術分享圖片

繼續執行步驟2和3,直到兩個哨兵相遇,:

技術分享圖片
技術分享圖片

左右兩個哨兵都走到3:
技術分享圖片

  • 步驟4:將開始選擇基準數字6換到中間,測試6左邊的數都小於6,右邊的數都大於6。完成第一次循環:

技術分享圖片
技術分享圖片

第一次完成之後,再按照此方法分別對6左右兩邊的數列進行遞歸排序即可。是不是很簡單。

看下代碼就更清晰了:

void quicksort(int a[], int left,int right)
    {
        int i,j,t,temp;
        if(left>right)
            return;

        temp=a[left]; //temp中存的就是基準數
        i=left;
        j=right;
        while(i!=j)
        {
            //順序很重要,要先從右邊開始找
            while(a[j]>=temp && i<j)
                j--;
            //再找右邊的
            while(a[i]<=temp && i<j)
                i++;
            //交換兩個數在數組中的位置
            if(i<j)
            {
                t=a[i];
                a[i]=a[j];
                a[j]=t;
            }
        }
        //最終將基準數歸位
        a[left]=a[i];
        a[i]=temp;

        quicksort(a, left,i-1);//繼續處理左邊的,這裏是一個遞歸的過程
        quicksort(a, i+1,right);//繼續處理右邊的 ,這裏是一個遞歸的過程
    }

也可以這麽寫:

/**
     * 快排
     * @param arr
     * @param low
     * @param high
     * @return
     */
    public static int[] quit(int arr[], int low, int high) {
        int l = low;
        int h = high;
        int key = arr[l];  //先找出一個數作為基準數(這裏取數組最中間的一位)

        while (l < h) {
            while (l < h && arr[h] >= key) h --; //從後向前:尋找比基準數小的數據,如果找到,停下來
            if (l < h) {  //“探測”到了符合要求的數據,則交換數據,繼續順著方向尋找
                arr[l] = arr[h];
                l ++;
            }
            while (l < h && arr[l] <= key) l ++; //從前向後:尋找比基準數大的數據,如果找到,停下來
            if (l < h) { ////“探測”到了符合要求的數據,則交換數據,繼續順著方向尋找
                arr[h] = arr[l];
                h --;
            }
        }
        arr[l] = key;
        if (l > low) quit(arr, low, l - 1);
        if (h < high) quit(arr, h + 1, high);
        return arr;
    }

支持原文:https://tryenough.com/arithmetic-quitsort

教你學習快速排序算法-程序員必備哦