關於排序的穩定性
在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中r[i]=r[j],且r[i]在r[j]之前,而在排序後的序列中,r[i]仍在r[j]之前,則稱這種排序演算法是穩定的;否則稱為不穩定的。
一、 氣泡排序
氣泡排序的基本思想:每次比較兩個相鄰的元素,如果它們的順序錯誤就把他們交換過來
氣泡排序的原理:每一趟只能確定將乙個數歸位,如果有n個數進行排序,只需將n-1個數歸位,也就是說要進行n-1趟操作,而每一趟都需要從第1位開始進行相鄰兩個數的比較
1 #include 2氣泡排序的核心部分是雙重巢狀迴圈,氣泡排序的時間複雜度是o(n2),這個乙個非常高的時間複雜度#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 }
氣泡排序的優化:
當第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 是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢 浮 到數列的頂端。...