C C 學習 9 C C 優化排序

2022-04-04 01:52:13 字數 2882 閱讀 6591

說明:常見的排序演算法都是比較排序,非比較排序包括計數排序、桶排序和基數排序,非比較排序對資料有要求,因為資料本身包含了定位特徵,所有才能不通過比較來確定元素的位置。比較排序的時間複雜度通常為o(n2)或者o(nlogn),比較排序的時間複雜度下界就是o(nlogn),而非比較排序的時間複雜度可以達到o(n),但是都需要額外的空間開銷。本文將介紹的是各種比較排序演算法:

一. 各種排序演算法的比較

二. 未優化的冒泡選擇排序法

1.選擇排序法

1

void sortlist1(int *arr,int n)

2 13 }

14 }

15 }

2.氣泡排序法

1

void sortlist2(int *arr,int n)

2 13 }

14 }

15 }

三.優化冒泡選擇兩種排序方法1.選擇排序法的優化(以從小到大的排列順序為例)

從上面的**可知,選擇排序法的思想是讓第 i(i 從0開始) 個元素分別與其後面的每個元素進行比較,當比較結果為大於時,就進行交換,這樣比較一輪下來,第i個元素成了此輪比較中的最小元素,再繼續比較完所有輪,就實現了陣列從小到大的排列。這樣的排列使得選擇排序法的交換次數過於多,降低了排序效率。所以,對選擇排序法的優化方案就是:比而不換,記錄下標!

1

void sortlist(int *p,int n)

2 11

if(idx != i)

12

17 }

18 }

如上**,每次內重迴圈之後,idx記錄本次迴圈中比較的最小值或最大值(此處為最小值),若idx != i,則說明 i 並不是這次比較的最大或最小值,則進行交換,結束本次迴圈。

2.氣泡排序法優化(以從小到大為例)

氣泡排序法的思想是每輪用第 j(j從0開始) 個元素與第 j+1個元素進行比較,如果大於則交換;這樣一輪下來,最大的元素就像冒泡一樣到了最後,這樣繼續比較完所有輪,就實現了冒泡從小到大排序。由此可見,對於氣泡排序法,當某一輪中沒有發生過元素的交換時,則表明整個元素序列已經有序了,從而不需要在比較下去。因此,氣泡排序的優化方案為:序而不排。

1

void sortlist2(int *p,int n)

2 16 }

17if(flag == 0)

18break;

19 }

20 }

如果在乙個內迴圈之內,都為有序排列,即沒發生過交換事件,則標誌flag為0,直接退出迴圈。

四. 快速排序

排序思想:對一組元素,選取第乙個元素為比較基數,然後其他元素與他進行比較,比它大的放右邊,比它小的放左邊,一輪完成,該元素左邊都是比它自身小的,右邊都是比它大的;然後分別對剛才基數左邊和右邊的元素重複上述操作,直至排序完成。

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 }

其中 p 為陣列名,low為陣列起始位址 0,high 為陣列的元素個數減1。

五.插入排序法

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 冒泡公升序...