前言:
本人自接觸演算法近2年以來,在不斷學習中越多地發覺各種演算法中的美妙。之所以在這方面過多的投入,主要還是基於自身對高階程式設計的熱愛,對數學的沉迷。回想一下,先後也曾參加過acm大大小小的校級賽、區域賽。沒什麼驚天動地的獎項,最好的名次也就省三等獎。現在作為第一篇演算法總結就拿常見的排序演算法以我個人的理解,以及**實現跟大家簡單分享一下(排序演算法如果一一羅列的話,不下十種。曾在圖書館的舊書架上看過一本近900頁的書,內容就是專門介紹排序演算法)。
選擇排序(select)
選擇排序比較容易理解,每一次往後遍歷都是為了尋找「最小值」的下標。n
次遍歷,時間複雜度為:
o(n^2)
氣泡排序(bubble
)氣泡排序也比較形象,理解為大氣泡不斷下沉,小氣泡往上冒。同樣往後進行n
次遍歷,時間複雜度為:
o(n^2)
。跟選擇排序的區別:選擇排序屬於穩定排序,從初始狀態到排序完成過程中的每一次遍歷各元素前後位置「相對穩定」。而且,氣泡排序每一輪遍歷可能產生多次交換
swap()
,而選擇排序固定每一輪的遍歷都只進行一次交換
swap()
操作。插入排序(insert)
插入排序可以理解為對撲克牌排序,原先拿到一手雜亂的牌,通過「插入」將所有牌排好序。
一般的插入排序時間複雜度同樣是:o(n^2)
,進行具體樣例測試時跟樣例資料的初始順序有關。
希爾排序(shell
)希爾排序為進化版的插入排序,只因為其基於插入排序的思想上,加入步長」step」。一般讀者可能不知道希爾排序應用到大量資料的排序的高效,據研究的學者表明一般情況下希爾排序的排序時間複雜度降低為o(n^(3/2))
歸併排序(merge)
歸併排序是基於遞迴的思想進行的一種時間複雜度為:o(n*lgn)
排序演算法,不過其附加
o(n)
的空間輔助代價。理解好歸併排序後可以將其遞迴思想擴充套件應用到數列逆序數的求解問題上,這裡不再展開。
快速排序(quick)
快速排序有多種實現方式,同樣是利用遞迴的思想,不斷將問題劃分為具有相同性質的子問題進行求解。實現快速排序演算法的平均時間複雜度為:o(n*lgn);
快排的o(n*lgn)
演算法同樣通過拓展可以用於求無序數列的「第
k大」元素。
堆排序(heap)
二叉堆,簡稱堆(heap)
。一種非常奇妙的資料結構,是本人接觸過的演算法當中最驚嘆的演算法之一,僅僅利用陣列就可以實現。在堆排序中,我們一般採用大根堆,時間複雜度
o(n*lgn)
,排序效果較快排穩定,而且也不需要額外的空間儲存代價。
**實現部分(c/c++),本程式建議在codeblocks這款介面比較友好的ide測試。
1/*2測試演示:*排序演算法彙總(c/c++實現)3*/
4 #include 5 #include 6
//#define swap(x,y)
7#define swap(x,y)89
const
int n = 10;10
11void selectsort(int *a,int
n)17
swap(a[i],a[min]);18}
19}20//
something error!
21void bubblesort(int *a,int
n)26}27
void insertsort(int *a,int
n)32}33
}34void shellsort(int *a,int
n)44 h /=step;45}
46}47void mergesort(int *a,int p,int q,int *t)
58for(int i=p;i)
59 a[i] =t[i];60}
61void qsort(int *a,int p,int
q)68 i=i+1;69
swap(a[i],a[q]);
7071 qsort(a,p,i-1
);72 qsort(a,i+1
,q);73}
7475
void sink(int *a,int n,int
k)84}85
void heapsort(int *a,int
n)93}94
void pt(int *a,int s,int
n)99
intmain();
102int b[n+1]=;
103int
t[n];
104int
c;105 printf("
請選擇一種排序演算法:\n 1.選擇排序\n 2.氣泡排序\n 3.插入排序\n 4.希爾排序\n 5.歸併排序\n 6.快速排序\n 7.堆排序\n ----> ");
106 scanf("
%d",&c);
107switch
(c)133 printf("
輸出結果:\n");
134if(c==7
)135 pt(b,1,n+1
);136
else
137 pt(a,0
,n);
138139
return0;
140 }
結語:
以上排序演算法尚不能涵蓋所有排序演算法,比如基數排序,字串排序等。本次排序演算法分享內容就此打住,往後將持續更新。。。(因水平有限錯漏在所難免,望各朋友不吝批評指正^_^)
排序演算法的實現 C C 實現
存檔 1 include 2 include 3 include 4 define maxsize 20 5using namespace std 6int main 749 cout 50 cout 請重新輸入您的選擇 51 cin num 52 53return0 54 1 typedef st...
快速排序演算法實現C C
對於包含n個數的輸入陣列來說,快速排序是一種最壞情況時間複雜度為o n 2 的排序演算法。雖然最壞情況時間複雜度很差,但是快速排序通常是實際排序應用中最好的選擇,因為它的平均效能非常好 它的期望時間複雜度是o nlgn 而且o nlgn 中隱含的常數因子非常小,另外他還能夠進行原址排序,甚至在虛擬環...
排序演算法 排序演算法彙總
排序演算法無疑是學習資料結構中的重點內容,本文將給出排序演算法的彙總。下面是具體的實現 include include include define n 1000000 int array n int temp n 1 氣泡排序 void bubblesort int a,int n if tag ...