每日演算法 C語言8大經典排序演算法(1)

2022-04-11 10:13:54 字數 3250 閱讀 2435

演算法一直是程式設計的基礎,而排序演算法是學習演算法的開始,排序也是資料處理的重要內容。所謂排序是指將乙個無序列整理成按非遞減順序排列的有序序列。排列的方法有很多,根據待排序序列的規模以及對資料的處理的要求,可以採用不同的排序方法。那麼就整理下網上搜尋的資料,按自己的理解,把c語言的8大排序演算法列出來。

普通意義上,排序演算法可以分為三大類:

1 交換類排序法

2 插入類排序法

3 選擇類排序法

一.交換類排序法

所謂交換排序法是指借助資料元素之間互相交換進行排序的方法。氣泡排序與快速排序法都屬於交換類排序方法。

1、氣泡排序(bubblesort)

氣泡排序的基本概念:

依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟:首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。至此第一趟結束,將最大的數放到了最後。在第二趟:仍從第一對數開始比較(因為可能由於第2個數和第3個數的交換,使得第1個數不再小於第2個數),將小數放前,大數放後,一直比較到倒數第二個數(倒數第一的位置上已經是最大的),第二趟結束,在倒數第二的位置上得到乙個新的最大數(其實在整個數列中是第二大的數)。如此下去,重複以上過程,直至最終完成排序。由於在排序過程中總是小數往前放,大數往後放,相當於氣泡往上公升,所以稱作氣泡排序。

實現:外迴圈變數設為i,內迴圈變數設為j。假如有10個數需要進行排序,則外迴圈重複9次,內迴圈依次重複9,8,...,1次。每次進行比較的兩個元素都是與內迴圈j有關的,它們可以分別用a[j]和a[j+1]標識,i的值依次為1,2,...,9,對於每乙個i,j的值依次為1,2,...10-i。

圖示:

c語言實現:

1

void bublesort(int a,intn)2

14}15}

16 }

效能分析:

若記錄序列的初始狀態為"正序",則氣泡排序過程只需進行一趟排序,在排序過程中只需進行n-1次比較,且不移動記錄;反之,若記錄序列的初始狀態為"逆序",則需進行n(n-1)/2次比較和記錄移動。因此氣泡排序總的時間複雜度為o(n*n)。

中,有一篇博文是關於冒泡演算法的優化,可以看下,兩種優化:

2、快速排序(quicksort)

基本思想:

快速排序是對氣泡排序的一種改進。由c. a. r. hoare在2023年提出。它的基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。

實現:設要排序的陣列是a[0]……a[n-1],首先任意選取乙個資料(通常選用第乙個資料)作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。值得注意的是,快速排序不是一種穩定的排序演算法,也就是說,多個相同的值的相對位置也許會在演算法結束時產生變動。

一趟快速排序的演算法是:

1)設定兩個變數i、j,排序開始的時候:i=0,j=n-1;

2)以第乙個陣列元素作為關鍵資料,賦值給key,即key=a[0];

3)從j開始向前搜尋,即由後開始向前搜尋(j -- ),找到第乙個小於key的值a[j],a[i]與a[j]交換;

4)從i開始向後搜尋,即由前開始向後搜尋(i ++ ),找到第乙個大於key的a[i],a[i]與a[j]交換;

5)重複第3、4、5步,直到 i=j; (3,4步是在程式中沒找到時候j=j-1,i=i+1,直至找到為止。找到並交換的時候i, j指標位置不變。另外當i=j這過程一定正好是i+或j-完成的最後令迴圈結束。)

圖示:

舉例說明:

如無序陣列[6 2 4 1 5 9]

a),先把第一項[6]取出來,

用[6]依次與其餘項進行比較,

如果比[6]小就放[6]前邊,2 4 1 5都比[6]小,所以全部放到[6]前邊

如果比[6]大就放[6]後邊,9比[6]大,放到[6]後邊,//6出列後大喝一聲,比我小的站前邊,比我大的站後邊,行動吧!霸氣十足~

一趟排完後變成下邊這樣:

排序前 6

2 4 1 5 9

排序後 2 4 1 5

6 9b),對前半拉[2 4 1 5]繼續進行快速排序

重複步驟a)後變成下邊這樣:

排序前 2 4 1 5

排序後 1 2 4 5

前半拉排序完成,總的排序也完成:

排序前:[6 2 4 1 5 9]

排序後:[1 2 4 5 6 9]

c語言實現:

1

int partition(int *data,int low,int

high)23

2324   data[low] =t;

2526

return

low;

2728}29

30void sort(int *data,int low,int high) //

快排每趟進行時的樞軸要重新確定,由此進

//一步確定每個待排小記錄的low及high的值

3132   

效能分析快速排序的時間主要耗費在劃分操作上,對長度為k的區間進行劃分,共需k-1次關鍵字的比較。

最壞情況是每次劃分選取的基準都是當前無序區中關鍵字最小(或最大)的記錄,劃分的結果是基準左邊的子區間為空(或右邊的子區間為空),而劃分所得的另乙個非空的子區間中記錄數目,僅僅比劃分前的無序區中記錄個數減少乙個。時間複雜度為o(n*n)

在最好情況下,每次劃分所取的基準都是當前無序區的"中值"記錄,劃分的結果是基準的左、右兩個無序子區間的長度大致相等。總的關鍵字比較次數:o(nlgn)

儘管快速排序的最壞時間為o(n2),但就平均效能而言,它是基於關鍵字比較的內部排序演算法中速度最快者,快速排序亦因此而得名。它的平均時間複雜度為o(nlgn)。

8大經典資料探勘演算法

大概花了將近2 個月的時間,自己把 18大資料探勘的經典演算法進行了學習並且進行了 實現,涉及到了決策分類,聚類,鏈結挖掘,關聯挖掘,模式挖掘等等方面。也算是對資料探勘領域的小小入門了吧。下面就做個小小的總結,後面都是我自己相應演算法的博文鏈結,希望能夠幫助大家學習。1.c4.5演算法。c4.5 演...

十大經典排序演算法

載自 排序演算法是 資料結構與演算法 中最基本的演算法之一。排序演算法可以分為內部排序和外部排序,內部排序是資料記錄在記憶體中進行排序,而外部排序是因排序的資料很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。常見的內部排序演算法有 插入排序 希爾排序 選擇排序 氣泡排序 歸併排序 快速排...

十大經典排序演算法

不穩定排序種類為4種 快速排序 核心思想是partition操作 二分法分而治之 平均時間複雜度nlogn 希爾排序 高階版的插入排序,先把間隔較遠的子串行排序,最後間隔為1時,等同於插入排序 插入排序在序列有序時,時間複雜度常數級,所以先讓子串行總體有序,能有效降低時間複雜度 平均時間複雜度n 1...