說明:常見的排序演算法都是比較排序,非比較排序包括計數排序、桶排序和基數排序,非比較排序對資料有要求,因為資料本身包含了定位特徵,所有才能不通過比較來確定元素的位置。比較排序的時間複雜度通常為o(n2)或者o(nlogn),比較排序的時間複雜度下界就是o(nlogn),而非比較排序的時間複雜度可以達到o(n),但是都需要額外的空間開銷。本文將介紹的是各種比較排序演算法:
一. 各種排序演算法的比較
:
二. 未優化的冒泡選擇排序法
1.選擇排序法
12.氣泡排序法void sortlist1(int *arr,int n)
2 13 }
14 }
15 }
1三.優化冒泡選擇兩種排序方法1.選擇排序法的優化(以從小到大的排列順序為例)void sortlist2(int *arr,int n)
2 13 }
14 }
15 }
從上面的**可知,選擇排序法的思想是讓第 i(i 從0開始) 個元素分別與其後面的每個元素進行比較,當比較結果為大於時,就進行交換,這樣比較一輪下來,第i個元素成了此輪比較中的最小元素,再繼續比較完所有輪,就實現了陣列從小到大的排列。這樣的排列使得選擇排序法的交換次數過於多,降低了排序效率。所以,對選擇排序法的優化方案就是:比而不換,記錄下標!
1如上**,每次內重迴圈之後,idx記錄本次迴圈中比較的最小值或最大值(此處為最小值),若idx != i,則說明 i 並不是這次比較的最大或最小值,則進行交換,結束本次迴圈。void sortlist(int *p,int n)
2 11
if(idx != i)
12
17 }
18 }
2.氣泡排序法優化(以從小到大為例)
氣泡排序法的思想是每輪用第 j(j從0開始) 個元素與第 j+1個元素進行比較,如果大於則交換;這樣一輪下來,最大的元素就像冒泡一樣到了最後,這樣繼續比較完所有輪,就實現了冒泡從小到大排序。由此可見,對於氣泡排序法,當某一輪中沒有發生過元素的交換時,則表明整個元素序列已經有序了,從而不需要在比較下去。因此,氣泡排序的優化方案為:序而不排。
1如果在乙個內迴圈之內,都為有序排列,即沒發生過交換事件,則標誌flag為0,直接退出迴圈。void sortlist2(int *p,int n)
2 16 }
17if(flag == 0)
18break;
19 }
20 }
四. 快速排序
排序思想:對一組元素,選取第乙個元素為比較基數,然後其他元素與他進行比較,比它大的放右邊,比它小的放左邊,一輪完成,該元素左邊都是比它自身小的,右邊都是比它大的;然後分別對剛才基數左邊和右邊的元素重複上述操作,直至排序完成。
1其中 p 為陣列名,low為陣列起始位址 0,high 為陣列的元素個數減1。void sortlist3(int *p,int low,int high)
2 18 p[h] = middle;
19 sortlist3(p,low,h-1);
20 sortlist3(p,h+1,high);
21 }
22 }
五.插入排序法
1六.希爾排序法void insertsort(int arr,int length,int beg = 0,int step = 1
) 10 arr[temp] =temparr;11}
12}13 }
1七. 歸併排序法void shellsort(int arr,int
length)
14 }
1八. 堆排序/*合併兩個有序陣列*/2
void unionarray(int arr,int beg,int mid,int end,int*p) 16}
17for(int i = beg;i<=end;i++)
18 arr[i] = p[i-beg];19}
20/*
歸併排序
*/21
void guibingsort(int arr,int beg,int end,int *p)
1/*交換陣列兩個元素*/2
void swap(int arr,int a,int
b) 7
/*大頂堆維護*/8
void heapadjust(int arr,int pos,int
_size) 20}
21/*
堆排序主程式
*/22
void heapsort(int arr,int
_size)
29 }
c c 學習筆記 9
在c c 語言中,函式本身不是變數,但可以定義指向函式的指標。這種型別的指標可以被賦值 存放在陣列中 傳遞給函式以及作為函式的返回值等等。由於指向函式的指標還是實踐的比較多,書中是以改寫快速排序為例子的,現在呢,我們就來編寫乙個線性排序。1 int lsearch void key,void bas...
C C 實現選擇排序及優化
1.選擇排序描述 選擇排序 selection sort 是一種簡單直觀的排序演算法。2.原理 每次從未排序的序列中選出最大 小 的乙個放在已排序 的後面。例如,將一串數字5,4,2,0,7,8,1,3,9,6用選擇排序從小到大排序的步驟如下 第一步 找出最小數字0,並與第乙個數字5進行交換,得到0...
演算法導論 排序的9種實現 C C
演算法導論 中並沒有討論這麼多排序演算法。在此羅列出來,僅僅是為了今後便於檢視。基數排序 桶排序後續補充。氣泡排序有很多種實現方式。下面總結常見的幾種,並對氣泡排序進行改進。氣泡排序1 冒泡公升序排序1,強烈推薦,好記 void bubblesort int arr,int length 冒泡公升序...