排序演算法總結(C語言)

2021-10-23 01:13:46 字數 4812 閱讀 4022

總結包括:氣泡排序、選擇排序、插入排序、希爾排序、堆排序、歸併排序、快速排序、桶排序

氣泡排序是從後往前(或從前往後),比較相鄰的兩個元素,如果有逆序則交換他們。這樣每趟就將最小(或最大)元素移到待排元素的一端。最多n - 1趟,就可以把所有元素排好序。

時間複雜度

最好情況

最壞情況

額外空間複雜度

穩定性o(n^2)

o(n)

o(n^2)

o(1)

穩定

void

bubblesort_2

(elemtype arr,

int n)if(

!flag)

break

;//無交換時退出迴圈

}}

選擇排序是每趟將最大或者最小的數放到待排序列的一端。該方法相對更好理解。但是無論最好還是最壞情況,其時間複雜度都是o(n^2)。

時間複雜度

最好情況

最壞情況

額外空間複雜度

穩定性o(n^2)

o(n^2)

o(n^2)

o(1)

不穩定

void

selectsort

(elemtype arr,

int n)

swap

(arr+index,arr+i)

;//等價於swap(&arr[index],&arr[i]);

}}

插入排序與生活中打牌類似,每次取牌插入手中已經排好序的牌當中。最好的情況時間複雜度為o(n),也就是每次都插在排好序的牌的後面(即不需要挪動已經排好的數)。

時間複雜度

最好情況

最壞情況

額外空間複雜度

穩定性o(n^2)

o(n)

o(n^2)

o(1)

穩定

void

insertsort

(elemtype arr,

int n)

}

希爾排序是插入排序的優化版本。希爾排序也是首次將時間複雜度降到o(n^2)以下的排序演算法之一。希爾排序將先比較距離較大的元素。通俗的講,就是對待排序陣列進行預處理,讓每組裡面兩個數的跨度減小。這裡採用了sedgewick增量序列。

時間複雜度

最好情況

最壞情況

額外空間複雜度

穩定性o(n^k)

o(n^k)

o(n^2)

o(1)

不穩定注: k < 2,取決於選的增量序列。

_

void

shellsort

(elemtype arr,

int n)

;//找到不大於n的sedgewick值

for(index =

0; sedgewick[index]

> n; index++);

for(interval = sedgewick[index]

; interval >

0; interval = sedgewick[

++index]

)for

(i = interval; i < n; i++

)}

堆排序利用的是最小/大堆的結構進行排序。首先將陣列調整為堆,然後每次取堆頂元素,與待排序列最後乙個數交換,重新下濾,調整為堆結構。

時間複雜度

最好情況

最壞情況

額外空間複雜度

穩定性o(nlogn)

o(nlogn)

o(nlogn)

o(logn)

不穩定

//下濾操作 

void

perdown

(elemtype arr,

int pos,

int n)

arr[parent]

= tmp;

}void

heapsort

(elemtype arr,

int n)

}

歸併排序採用的是分治思想,選取每次待排序列的中間作為分界。然後,將左邊和右邊的陣列分別遞迴採用歸併排序,然後將排序好的左右兩邊的陣列合併。歸併排序有乙個缺點就是,占用o(n)的空間。當我們滿載執行的時候只能排序空間一半的數。

時間複雜度

最好情況

最壞情況

額外空間複雜度

穩定性o(nlogn)

o(nlogn)

o(nlogn)

o(n)

穩定遞迴

void

merge

(elemtype arr,

int tarr,

int left,

int center,

int right)

while

(i <= center) tarr[index++

]= arr[i++];

while

(j <= right) tarr[index++

]= arr[j++];

for(i =

0; i < arrnums; i++

, left++

) arr[left]

= tarr[left];}

void

msort

(elemtype arr[

], elemtype tarr,

int left,

int right)

}void

mergesort

(elemtype arr,

int n)

void

merge_2

(elemtype arr,

int tarr,

int left,

int center,

int right)

while

(i <= center) tarr[index++

]= arr[i++];

while

(j <= right) tarr[index++

]= arr[j++];

}void

msort_2

(elemtype arr[

], elemtype tarr,

int n,

int length)

void

mergesort_2

(elemtype arr,

int n)

//釋放臨時陣列空間

free

(tarr)

;}

快速排序採用的是分治法。每次在待排序列中取乙個基數,然後將比其小的數都移到左面,比其大的數都移到右面。然後在將左面的陣列和右面的陣列,分別執行上述過程,直至結束。其中最壞的情況就是每次基數都是待排序列中的最小數或者最大數,導致另一邊沒有數。

該排序演算法可聯想到找n個無序數中第k大個數問題

時間複雜度

最好情況

最壞情況

額外空間複雜度

穩定性o(nlogn)

o(nlogn)

o(n^2)

o(logn)

不穩定

void

qsort

(elemtype arr,

int left,

int right)

arr[low]

= tmp;

qsort

(arr, left, low-1)

;qsort

(arr, low+

1, right);}

//統一介面

void

quicksort

(elemtype arr,

int n)

arr[left]

= tmp;

return left;

}void

qsort

(elemtype arr,

int left,

int right)

桶排序適用於分布較為均勻的陣列,如果分布很不均勻用桶排序效率很低。對於每個桶內的元素,這裡都採用了快速排序進行排序。

時間複雜度

最好情況

最壞情況

額外空間複雜度

穩定性o(n+k)

o(n+k)

o(n^2)

o(n+k)

穩定

void

bucketsort

(elemtype arr,

int n)

num =

(max - min +1)

/100+1

; ptr =

(bucket *

)malloc

(sizeof

(bucket)

* num)

;//本題中作用是將每個桶中的node陣列和count置0

memset

(ptr,0,

sizeof

(bucket)

* num)

;//將陣列裝入每個桶中

for(i =

0; i < n; i++)

pos =0;

//將桶中元素分別排序好,依次放入原來陣列中

for(

int i =

0; i < num; i++)}

//釋放桶空間

free

(ptr)

;}

C語言排序演算法總結

排序演算法一直都是讓我頭疼的演算法。為了全面掌握排序演算法,我就整理了常用的排序演算法。首先我們來了解一些基本概念 1 穩定排序和非穩定排序 簡單地說就是所有相等的數經過某種排序方法後,仍能保持它們在排序之前的相對次序,我們就 說這種排序方法是穩定的。反之,就是非穩定的。比如 一組數排序前是a1,a...

C語言排序演算法總結

學計算機程式設計的應該都知道,演算法是程式之魂。所謂演算法,就是解決問題的方法加上有限的實現步驟。演算法的特點有有窮性,確定性,有效性,有零個或多個輸入,有乙個或多個輸出。下面我們就來簡單總結一下c語言中的三種經典排序演算法。一 冒泡演算法。所謂氣泡排序法,就是對一組數字進行從大到小或從小到大排序的...

C語言排序演算法總結 希爾排序

之前我們總結了比較簡單的幾種排序方法。冒泡,選擇,排序。但是也提到了這些排序方法的缺陷。時間複雜度太高,在有大量資料需要排序的時候,會需要浪費太多的時間。所以在很多場景中是不適合使用。我們這次總結一種時間複雜度更優秀的希爾排序。希爾排序是以插入排序為基礎的改進版本。是由shell提出的方法。所以就叫...