排序演算法C 實現之快速排序詳解

2021-10-07 11:12:26 字數 1924 閱讀 1451

將一組大規模無序陣列變為有序

在陣列中隨機選擇乙個數作為基準數temp,

在陣列中從後往前找乙個比temp小的數lo,交換lo和temp

在陣列中從前往後找乙個比temp大的數hi,交換temp和hi

重複2、3找lo和hi,直到找不到這樣的數lo,hi。此時temp左邊的數都<=它,右邊的數都》=它。此時temp所在位置就是陣列有序後其應該在的位置

將temp左邊的數看做乙個無序陣列,重複步驟1-4,又會得到乙個新的temp

將temp右邊的數看做乙個無序陣列,重複步驟1-4,又會得到乙個新的temp

得到新的temp後再重複步驟5、6,直到temp左邊和右邊都沒有無序陣列了,此時整個陣列有序

將上述步驟轉換為程式語言時,有些地方要注意:

在步驟2,3中,temp的位置在不停地被交換,只有在步驟4中找到位置時才確定其所在。而在程式中把temp取出,相當於空出來乙個位置,把接下來要和temp交換的位置處的數值賦值給這個空位置即可。

在步驟2中從後往前找,實際上就是陣列索引從最大值不斷減小找;在步驟3中從前往後找,實際上就是陣列索引從最小值不斷增大來找

步驟5,6中的左邊無序陣列的索引最小值就是當前陣列的最小值,最大值是temp所在位置索引減1;右邊無序陣列的索引最小值是temp所在位置索引加1,最大值是當前陣列的最大值

步驟5-7顯然是要遞迴

通過不斷比較將小數前移大數後移來將隨機選取的基準數放置在其在有序陣列中應該在的位置,通過遞迴呼叫將不斷地把隨機選取的基準數放置在其所在陣列有序時應該在的位置。

using system;

namespace sort

program ps = new program();

ps.quicksort(a,0,a.length-1);

console.writeline("排序結果:");

foreach (int a in a)

bool issorted = true;

for (int i = 0; i < a.length - 1; i++)

console.write(issorted);

console.readkey();

}public void quicksort(int a,int lo,int hi)

int i = lo;

int j = hi;

int temp = a[i];//取得基準數,空出乙個位置

while (i=a[i])//從前往後找比temp大的數,將比temp大的數往後移

a[j] = a[i];//將比基準數大的數放在hi空出來的位置,如此,i所在的位置又空了出來

}a[i] = temp;

quicksort(a,lo,i-1);//對lo到i-1之間的數再使用快速排序,每次快速排序的結果是找到了基準數應該在的位置

//其左邊的數都<=它,右邊的數都》=它,它此時在陣列中的位置就是排序好時其應該在的位置。

quicksort(a,i+1,hi);//對i+1到hi之間的數再使用快速排序}}

}

1.雖然文中說基準數可以隨機選取,但在**時對遞迴呼叫時的每個無序陣列選取的都是其第乙個元素。你當然也可以選擇中間的元素,temp=a[(lo+hi)/2]即可。面對不同的資料,具體怎麼來選擇這個隨機基準數沒有特定的方法。一般就取第乙個元素或中間元素即可。

隨機基準數選取的不好,可能出現這樣的結果(以選取第乙個元素為例):比較了一圈發現,基準數隻向後移動了兩三位就到了其應在位置。那麼其左邊的無序陣列很小,右邊的無序陣列很大。在為右邊的無序陣列選擇的基準數找位置時,要找很多次。這就增加了計算時間。最好是每次為基準數找好位置時,其位置為當前陣列的最中間,那樣左右兩邊的無序陣列大小相同。

2.不斷遞迴呼叫時,當前的無序陣列規模是在不斷減小的,當規模減小到一定程度可以用插入排序代替快速排序。插入排序在小規模資料中排序速度更快。

排序演算法C 實現之氣泡排序詳解

假設現在我們有一組資料a 將資料組中的資料元素從小到大排列 即順序,反之逆序 使得資料組由無序變為有序。第一步 按照從左到右的順序獲取資料元素。注意 從左到右 是我們在視覺上看這組資料的描述,在記憶體中或者說在寫 時,我們是按照資料元素的索引從小到大獲取元素的。第二步 比較獲取的第乙個元素與第二個元...

排序演算法C 實現之選擇排序詳解

將無序陣列變為有序陣列 通過迴圈,每次選出在當前的剩餘元素中最小的元素,使得這些選出的元素構成有序陣列 using system namespace selectionsort program ps new program ps.selectsort a console.writeline 排序結果...

排序演算法C 實現之推排序詳解

將一組無序陣列變為有序 首先,要對二叉樹有個基本的了解。在大頂堆中,我們可以輕易獲得最大值。在小頂堆中,我們可以輕易獲得最小值。以大頂堆為例,我們將獲得的最大值max拿出來,將它和陣列arr的末尾元素x交換,這樣我們將陣列中的最大值放在陣列的末尾了 即我們從小到大,公升序排序 這就和選擇排序一樣,選...