相對於桶排序,節省了空間,相對於氣泡排序,節省了時間,可謂是兩者兼顧的一種更優化的演算法
實現:假設有 初始序列"6 1 2 7 9 3 4 5 10 8"。那麼從初始序列的兩端開始探測。先從右往左找到乙個比6小的數,然後在從左往右找到乙個比6大的數,然後交換他們。
「6 1 259 3 4710 8」
這裡可以用兩個變數i,j,分別指向序列的最左邊和最右邊。我們這裡叫這兩個變數為「哨兵i」 和「哨兵j」。
第一次交換結束後。接下來哨兵j繼續向左挪移,找到比「基數6」小的後停下來,然後「哨兵i」移動,然後交換
然後在次挪移的時候,發現「哨兵i」 跟 「哨兵j」 相遇了。都走到了3的前面,說明此時「探測」結束。我們將6和3進行交換。
3** 1 2 5 469 7 10 8」
至此第一輪「探測」結束 , 此時以基準數 6 為分界點,6左邊的數都小於等於 6,6右邊的數都大於等於 6。
此時基準數 6 已經歸位,他正好處在序列 的第六位,此時我們已經將原來的序列,以6為分界線拆分 成了兩個序列,左邊的序列是 「3 1 2 5 4」,右邊的序列是「9 7 10 8」 ,接下來還要分別處理之和兩個序列 , 因為6左邊跟右邊的序列目前還都是 很混亂的。
後續的處理就是只要模擬剛才的方法分別處理6兩遍的序列即可 。
#include
#define maxn 105
using
namespace std;
int a[maxn]
;void
qksort
(int left,
int right)
flag = a[left]
; i = left;
j = right;
while
(i!=j)
while
(a[i]
<=flag&&iif(i} a[left]
= a[i]
; a[i]
= flag;
qksort
(left,i-1)
;qksort
(i+1
,right);}
intmain()
qksort(1
,n);
for(
int i=
1;i<=n;i++
) cout
}
最常用的排序 快速排序
是一種不浪費空間又可以快一點的排序演算法。假設對 6 1 2 7 9 3 4 5 10 8 這10個數進行排序。首先在這個序列裡隨便找乙個數作為基準數。為了方便,讓6作為基準數,將這個序列中所有比基準數大的數放在6的右邊,比基準數小的數放在6的左邊。方法 分別從初始序列 6 1 2 7 9 3 4 ...
最常用的排序 快速排序法
桶排序浪費空間,氣泡排序雖然解決了空間問題卻在演算法的執行效率上犧牲了很多,因此我們的快速排序法就誕生了,是不是聽這個名字就很高檔呢?假設現在需要對 6,1,2,7,9,3,4,5,10,8 這十個數排序.我們需要先定義乙個基準數,其實也就是乙個作為參照的數,為了方便一般就把第乙個數作為基準數,也就...
對於最常用的排序快速排序的思考
快速排序的整體思想就是分治思想,選取乙個基準值,從左右兩邊各選取乙個值進行交換 左邊選乙個大於基準值的位置,右邊選乙個小於基準值的位置 在效果上就是將乙個大空間分成了左右兩個小空間,然後遞迴再再將左右兩個空間分成更小的兩個空間。它和氣泡排序最大的區別就是 冒泡每次交換的是兩個相鄰的數,而快排的交換距...