是一種不浪費空間又可以快一點的排序演算法。
假設對「6 1 2 7 9 3 4 5 10 8」這10個數進行排序。首先在這個序列裡隨便找乙個數作為基準數。為了方便,讓6作為基準數,將這個序列中所有比基準數大的數放在6的右邊,比基準數小的數放在6的左邊。
方法:分別從初始序列「6 1 2 7 9 3 4 5 10 8」兩端開始探測,先從右往左找乙個小於6的數,再從左往右找乙個大於6的數,然後交換它們。可以用兩個變數i和j,分別指向序列最左邊和最右邊。剛開始讓i指向序列的最左邊(即i = 1),指向數字6。讓j指向序列的最右邊(即j=10),指向數字8。
首先j開始出動,因為基準數是最左邊的數,所以j先出動。j向左動(即j–),直到找到乙個小於6的數停下來。下邊i向右動(即i++),直到找到乙個大於6 的數停下來,最後j停在了數字5,i停在了數字7。交換i和j所指向的元素的值。交換後的序列為「6 1 2 5 9 3 4 7 10 8」。
第一次交換結束,j繼續向左動(每次必須是j先出發),j停在數字4,i停在數字9,再次交換後序列為「6 1 2 5 4 3 9 7 10 8」。第二次交換結束,繼續挪動。j停在數字3。i向右與j相遇。探測結束,將基準數6與3 交換。交換後的序列為「3 1 2 5 4 6 9 7 10 8」。此時第一輪探測真正結束。以基數6為分界點,6左邊的數都小於等於6,6右邊的數都大於等於6 。其實i和j就是分別要找到大於和小於基準數的數,直到i和j碰頭。
以6 為分界點分成兩個序列,左邊的序列是「3 1 2 5 4」,右邊的序列是「9 7 10 8」。要分別處理這兩個序列,模擬上邊的方法進行處理。
對於「3 1 2 5 4」,以3為基準數,第一次交換「2 1 3 5 4」,3已經歸位,再整理3左右兩邊的序列。
快速排序之所以快,是因為相比氣泡排序,每次交換是跳躍式的。每次排序的時候設定乙個基準點,將小於等於基準點的數全都放在基準點的左邊,大於等於基準點的數都放在基準點的右邊。在每次交換的時候不會像氣泡排序一樣只能在相鄰的數之間進行交換,交換的距離就大的多。總的比較和交換次數就少了,速度提高了。在最壞的情況下,也可能是相鄰的兩個數進行交換,快速排序的最差時間複雜度和氣泡排序是一樣的。都是o(n^2)。**如下:`
#includeint a[101],n; //定義全域性變數,需要在子函式中使用
void quicksort(int left,int right)
}//最終將基準數歸位
a[left] = a[i];
a[i] = temp;
quicksort(left,i-1);//繼續處理左邊的,是乙個遞迴的過程
quicksort(i+1,right);//繼續處理右邊的,是乙個遞迴的過程
return;
}int main()
最常用的排序 快速排序
相對於桶排序,節省了空間,相對於氣泡排序,節省了時間,可謂是兩者兼顧的一種更優化的演算法 實現 假設有 初始序列 6 1 2 7 9 3 4 5 10 8 那麼從初始序列的兩端開始探測。先從右往左找到乙個比6小的數,然後在從左往右找到乙個比6大的數,然後交換他們。6 1 259 3 4710 8 這...
最常用的排序 快速排序法
桶排序浪費空間,氣泡排序雖然解決了空間問題卻在演算法的執行效率上犧牲了很多,因此我們的快速排序法就誕生了,是不是聽這個名字就很高檔呢?假設現在需要對 6,1,2,7,9,3,4,5,10,8 這十個數排序.我們需要先定義乙個基準數,其實也就是乙個作為參照的數,為了方便一般就把第乙個數作為基準數,也就...
對於最常用的排序快速排序的思考
快速排序的整體思想就是分治思想,選取乙個基準值,從左右兩邊各選取乙個值進行交換 左邊選乙個大於基準值的位置,右邊選乙個小於基準值的位置 在效果上就是將乙個大空間分成了左右兩個小空間,然後遞迴再再將左右兩個空間分成更小的兩個空間。它和氣泡排序最大的區別就是 冒泡每次交換的是兩個相鄰的數,而快排的交換距...