排序(氣泡排序 快速排序

2022-07-03 17:42:10 字數 3311 閱讀 7182

關於排序的穩定性

在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中r[i]=r[j],且r[i]在r[j]之前,而在排序後的序列中,r[i]仍在r[j]之前,則稱這種排序演算法是穩定的;否則稱為不穩定的。

一、 氣泡排序

氣泡排序的基本思想:每次比較兩個相鄰的元素,如果它們的順序錯誤就把他們交換過來

氣泡排序的原理:每一趟只能確定將乙個數歸位,如果有n個數進行排序,只需將n-1個數歸位,也就是說要進行n-1趟操作,而每一趟都需要從第1位開始進行相鄰兩個數的比較

1 #include 2

#define max 734

int main(void)5

;89//

氣泡排序核心部分

10for (i = 0; i < max - 1; i++) //

n個數排序只需要n-1趟

1121}22

}23for (i = 0; i < max; i++)

2427

28return0;

29 }

氣泡排序的核心部分是雙重巢狀迴圈,氣泡排序的時間複雜度是o(n2),這個乙個非常高的時間複雜度

氣泡排序的優化:

當第i次氣泡排序一次都沒有交換,說明該序列已經變成有序的了,這樣就減少了比較次數(注意是比較次數,不是交換次數),**如下:

1 #include 2

#define max 734

int main(void)5

;1011//

氣泡排序核心部分

12for (i = 0; i < max - 1; i++) //

n個數排序只需要n-1趟

1325}26

if (flag == 0) /*

一次交換都沒有,說明已經是有序序列

*/2730}

31for (i = 0; i < max; i++)

3235 printf("

\n比較次數%d\n

", n);

3637

return0;

38 }

優化前:

優化後:

快速排序是基於二分的思想,對氣泡排序的一種改進

快速排序基本思想:

通過一趟排序將要排序的資料分割成獨立的兩部分:分割點左邊都是比它小的數,右邊都是比它大的數

然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。

快速排序原理:第一步:設定兩個指標left和right分別指向陣列的頭部和尾部,並且以頭部的元素(6)為基準數

第二步:right指標先往左移動,找到小於基準數的元素就停下,然後移動left指標(想一下為什麼是right先移動,不能是left先移動)

第三步:left指標往左移動,找到大於基準數的元素就停下,然後交換right和left指標所值元素的值

重複第二、三步,直到兩個指標left和right重合

第四步:兩個指標重合後將基準數(6)與兩個指標指向的元素值(3)交換

到這時,第一輪排序結束,此時以基準數(6)為分界點,(6)左邊的數都小於等於6,(6)右邊的數都大於等於6,現在我們已經將原來的序列以(6)為分界點拆成了兩個序列

左邊的序列是3 1 2 5 4,右邊的序列是9 7 10 8,接下來分別處理這兩個序列,因為處理方法與上圖相同,下面就不上圖了(摸個魚)

先處理3 1 2 5 4,以(3)為基準數,處理後結果為2 1 3 5 4

再處理(3)左邊的數2 1,以(2)為基準數,處理後為1 2

再處理(3)右邊的數5 4,以(5)為基準數,處理後為4 5

現在的序列為1 2 3 4 5 6 9 7 10 8,現在對9 7 10 8進行處理

因為處理方式與上面相同這裡不再贅述,處理結果為7 8 9 10

最終序列為1 2 3 4 5 6 7 8 9 10,到此排序完全結束(快速排序的每一輪處理其實就是將這一輪的基準數歸位,直到所有的數都歸位為止)

1 #include 2

void quicksort(int left, int right, int *a);34

#define n 7

5int main(void)6

;910 quicksort(0, n-1

, a);

1112

for(i = 0; i < n; i++)

1316

17return0;

18}19void quicksort(int left, int right, int *a)

2026

27 temp = a[left]; //

存入基準數

28 i =left;

29 j =right;

30while (i !=j)

3137

//從左往右找

38while (a[i] <= temp && j>i)

3942

43if (i

4449

}50 a[left] = a[i]; //

基準數歸位

51 a[i] =temp;

5253 quicksort(left, i - 1

, a);

54 quicksort(i + 1

, right, a);

5556

return

;57 }

快速排序在最壞的情況下,仍可能是相鄰的兩個數進行交換,

因此快速排序最差時間複雜度和氣泡排序是一樣的,都是o(n2),它的平均時間複雜度為o(nlogn)

排序 氣泡排序 快速排序

快速排序 氣泡排序就是自上向下依次對比兩個數字,若上面的數字大於下面的數字,則兩者交換,否則不交換。這樣每次迴圈結束,未排序的最大的數就到了最下面。如陣列前兩次迴圈過程如下 快速排序的核心是partition 函式,其功能如下所示 34的位置找到後,其將陣列分成兩部分,前一部分都比34小,後一部分都...

排序 氣泡排序 快速排序

1 基本思想 將第乙個記錄的關鍵字與第二個記錄的關鍵字比較,若為逆序,則將兩個記錄交換,再向後比較。關鍵字小的漂浮,關鍵字大的下沉。2 穩定性 演算法穩定。3 時間複雜度 o n 空間複雜度 o 1 4 實現 include define n 5 陣列長度上限 intmain printf 氣泡排序...

氣泡排序,快速排序

氣泡排序 氣泡排序 英語 bubble sort 是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢 浮 到數列的頂端。...