總結包括:氣泡排序、選擇排序、插入排序、希爾排序、堆排序、歸併排序、快速排序、桶排序
氣泡排序是從後往前(或從前往後),比較相鄰的兩個元素,如果有逆序則交換他們。這樣每趟就將最小(或最大)元素移到待排元素的一端。最多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提出的方法。所以就叫...