C語言常用排序演算法原理及實現

2021-10-09 14:32:46 字數 3651 閱讀 1173

一、氣泡排序

思路:每次冒泡,從第0個元素開始,相鄰兩個元素之間進行比較

如果元素大,則往後冒,否則不作交換

這樣,一次冒泡(即一層迴圈)下來之後,就可以確定乙個最大值且排在最後的位置

接下來的迴圈就對剩餘的元素重複之前的操作,相鄰相比,大者冒泡,找到第二大元素

以此類推,直到最後所有元素都到了相應的位置,冒泡結束

複雜度:o(n^2)

穩定性:是穩定的

void

bubblesort

(int

* array,

int length)

}}

二、選擇排序
思路:每次遍歷整個範圍,初始範圍為整個陣列,找到最大的數字和最小的數字

分別把最大放在最後、最小放在最前,然後下標移動,頭往後,尾往前,範圍向內縮小

重複上述過程,每一次都找到該搜尋範圍內的最小和最大並分別放到開頭和結尾位置

直到頭尾相碰,範圍縮小為0,則排序結束

複雜度:o(n^2)

穩定性:不穩定的

這裡用的是優化版的選擇排序,即每趟遍歷確定剩餘元素的最大值和最小值

void

selectsort

(int

* array,

int length)

if(max == head && min == tail)

else

if(max == head && min != tail)

else

if(max != head && min == tail)

else

}}

三、插入排序
思路:假定陣列的前面部分是已經排序好的(最開始只排了乙個),

然後從下標為「1」的元素開始進行一次for迴圈

迴圈中,在把當前下標的值和前面已經排序好的數字進行比較,

如果比前面的小,就和前面交換位置,直到不再比前面小,這樣就實現了數字的插入

即,每次外層迴圈實現的都是一次「乙個數字往乙個有序陣列中做插入」

複雜度:o(n^2)

穩定性:穩定的

void

insertsort

(int

* array,

int length)

else}}

}

四、希爾排序
思路:按照乙個步長h對陣列進行分組,比如

分組之後,對於每組元素分別進行插入排序,

完成之後,再對步長進行減半處理,更新步長

然後同樣的,按照步長進行分組,然後分別插入排序

直到最後步長為0,不再進行操作,則完成排序

複雜度:o(n^(3/2))

穩定性:不穩定的

void

shellsort

(int

* array,

int length)

else

}} h /=2

;//更新縮短步長

}}

五、歸併排序
思路:把陣列盡可能的等分成兩份——根據陣列的首元素下標和尾元素下標,可以得到中間值下標

然後將得到的兩個陣列再次遞迴呼叫本身,去進行進一步的劃分

直到陣列不可再分了——遞迴終止的條件——則返回

對劃分好的陣列,進行排序和歸併,由小及大

最開始,遞迴的最深層,對兩個陣列進行排序和歸併只是對兩個元素進行簡單比較並排序,然後歸併

這樣,由小及大,每一次得到的要處理的兩個陣列都是各自有序的

那麼,要對這兩個各自有序的陣列進行歸併,首先需要乙個新的空間——這裡我們是malloc乙個輔助陣列

然後利用三個「指標」分別指向左陣列的頭、右陣列的頭、輔助陣列的頭,然後開始比較左指標和右指標指向的值

然後再慢慢歸併,最終就可以積小成大了

複雜度:o(nlogn)

穩定性:穩定的

static

void

sortandmerge

(int

* array,

int* assist,

int head,

int mid,

int tail)

else

}//遍歷可能剩下的陣列中的元素

while

(left <= mid)

//遍歷可能剩下的陣列中的元素

while

(right <= tail)

//將歸併好的陣列從輔助陣列copy到原陣列中去

for(

int i = head; i <= tail; i++)}

static

void

separate

(int

* array,

int* assist,

int head,

int tail)

void

mergesort

(int

* array,

int length)

六、快速排序
思路:每次以陣列的第乙個元素為標準,將陣列分為兩等分,

左邊的數比標準小,右邊的數比標準大

然後得到的兩個陣列再分別遞迴進行分組操作

分組的過程實質上是「排序+求標準位置」的過程,

每次分組過後得到下一次分組的分界線,同時兩組元素實現了某種程度上的有序

——即左邊的比標準小,右邊的比標準大

複雜度:o(nlogn)

穩定性:不穩定

快排我寫得有點爛…

static

intfiltergetmid

(int

* array,

int head,

int tail)

if(array[head]

< array[standard]

&& array[tail]

< array[standard]

)else

if(array[head]

>= array[standard]

&& array[tail]

> array[standard]

)else}if

(array[head]

> array[standard]

&& array[tail]

< array[standard])}

//while

if(array[head]

< array[standard]

)return head;

}static

void

separate

(int

* array,

int head,

int tail)

void

quicksort

(int

* array,

int length)

常用排序演算法實現 C語言

排序演算法原理都不難,實現起來卻沒那麼簡單,特別是一些邊界問題的處理。前些天把這些常有的排序演算法實現了一遍,寫的也不太好,很多i,j,k之類的變數,也很多迴圈巢狀,不過初步測試是正確的。1 include stdio.h 23 void swap int a,int b 交換兩個整數 4void ...

排序演算法集合(3) 快速排序原理及C 實現

快速排序的思想是 1 初始輸入值是一串亂序的數字s 2 選取某個邏輯位置的值為 中間值 m 然後經過用s中的其他元素跟m比較 比m大的元素都調整到在 中間值 之前,其餘的放置在 中間值 之後 現在,序列成了 準排序 狀態,s被調整為s 分為三個部分p m q 而這三個部分有p m q的關係 p內任意...

常用演算法原理及實現(Java)

比較兩個相鄰的元素,將值大的元素交換至右端。依次比較相鄰的兩個數,每一次將小數放在前面,大數放在後面。如在第一趟 首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放在前,大數放在後,如此迴圈,直至比較最後兩個數,將小數放在前,大數放在後。重複第一趟步驟,直至全部排序...