排序演算法總結

2021-06-22 23:12:16 字數 4194 閱讀 8276

1、排序演算法概要

注:基數排序的複雜度中,

r代表關鍵字的基數,

d代表長度,

n代表關鍵字的個數。

2、 排序演算法——氣泡排序

氣泡排序是非常容易理解和實現,,以從小到大排序舉例:

設陣列長度為n。

1).比較相鄰的前後二個資料,如果前面資料大於後面的資料,就將二個資料交換。

2).這樣對陣列的第0個資料到n-1個資料進行一次遍歷後,最大的乙個資料就「沉」到陣列第n-1個位置。3).

n=n-1

,如果n不為0

就重複前面二步,否則排序完成。

常規實現:

void bubblesort(int num,int len)  

} end --;

bubblesort(data,start,end);

} }

注意問題:end--那裡,注意每次遞迴的起始終止下標的移動,起始下標不變,終止下標每次減1,迴圈結束條件 為start == end,以及i<length- 1;  

3、 排序演算法——直接插入排序

直接插入排序(insertion sort)的基本思想是:每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子串行中的適當位置,直到全部記錄插入完成為止。

設陣列為a[0…n-1]。

1). 初始時,a[0]自成1個有序區,無序區為a[1..n-1]。令i=1

2). 將a[i]併入當前的有序區a[0…i-1]中形成a[0…i]的有序區間。

3). i++並重複第二步直到i==n-1。排序完成。

常規實現:

void insertsort(int num,int len)

num[j+1]=temp;}}

}

對將a[j]插入到前面a[0…j-1]的有序區間所用的方法進行改寫,用資料交換代替資料後移。如果a[j]前乙個資料a[j-1] > a[j],就交換a[j]和a[j-1],再j--直到a[j-1] <= a[j]。這樣也可以實現將乙個新資料新併入到有序區間。

void insertsort(int a, int n)  

遞迴實現:

void insertationsort(int *data,int start,int end,int length)  

} //如果找到指定位置了,則指定位置元素開始集體向後挪動乙個單位,否則不變

if (index != end)

} end ++;

insertationsort(data, start, end, length);

} }

4、 排序演算法——希爾排序

希爾排序的實質就是分組插入排序,該方法又稱縮小增量排序,因dl.shell於2023年提出而得名。

該方法的基本思想是:先將整個待排元素序列分割成若干個子串行(由相隔某個「增量」的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。因為直接插入排序在元素基本有序的情況下(接近最好情況),效率是很高的,因此希爾排序在時間效率上比前兩種方法有較大提高。

以n=10的乙個陣列49, 38, 65, 97, 26, 13, 27, 49, 55, 4為例

第一次 gap = 10 / 2 = 5

49   38   65  97   26   13   27   49  55   4

1a                              1b

2a                               2b

3a                                3b

4a                                4b

5a                                5b

1a,1b,2a,2b等為分組標記,數字相同的表示在同一組,大寫字母表示是該組的第幾個元素, 每次對同一組的資料進行直接插入排序。即分成了五組(49, 13) (38, 27) (65, 49)  (97,55)  (26, 4)這樣每組排序後就變成了(13, 49)  (27, 38)  (49, 65)  (55,97)  (4, 26),下同。

第二次 gap = 5 / 2 = 2

排序後13   27   49  55   4    49   38   65  97   26

1a        1b         1c         1d         1e     

2a        2b         2c         2d         2e

第三次 gap = 2 / 2 = 1

4   26  13   27   38    49  49   55   97   65

1a  1b  1c  1d   1e    1f   1g   1h   1i    1j

第四次 gap = 1 / 2 = 0 排序完成得到陣列:

}附註:上面希爾排序的步長選擇都是從n/2開始,每次再減半,直到最後為1。其實也可以有另外的更高效的步長選擇,如果讀者有興趣了解,請參閱維基百科上對希爾排序步長的說明:

5、排序演算法——直接選擇排序

設陣列為a[0…n-1]。

1). 初始時,陣列全為無序區為a[0..n-1]。令i=0

2). 在無序區a[i…n-1]中選取乙個最小的元素,將其與a[i]交換。交換之後a[0…i]就形成了乙個有序區。

3). i++並重複第二步直到i==n-1。排序完成。

常規實現:

void selectsort(int num, int len)  

} if (start != index)

start ++;

selectionsort(data, start, end);

} }

注意問題:start ++那裡,注意每次遞迴的起始終止下標的移動,起始每次加1,終止下標不變,  

迴圈結束條件 為start == end,以及i<

end+ 1 

6、 排序演算法——歸併排序

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。

首先考慮下如何將將二個有序數列合併。這個非常簡單,只要從比較二個數列的第乙個數,誰小就先取誰,取了後就在對應數列中刪除這個數。然後再進行比較,如果有數列為空,那直接將另乙個數列的資料依次取出即可。

排序演算法總結

1 直接插入排序 1 穩定性 穩定 2 適用情況 待排記錄規模較小,或者記錄已經基本有序 2 希爾排序 1 穩定性 不穩定 2 特點 希爾排序的執行時間依賴於增量序列,它的效率比直接插入排序有較大的改進。3 氣泡排序 1 穩定性 穩定 2 特點 當待排記錄基本有序是,氣泡排序是不錯的選擇 但由於氣泡...

排序演算法總結

1 選擇排序 選擇排序的思想是依次從待排序數列中選擇最大 小 的 第二大 小 的等等,然後依次重新排列為有序數列。void selectionsort int a,int n if min i 時間複雜度o n 2 2 歸併排序 void merge int a,int left,int mid,i...

排序演算法總結

學習了這麼多的排序演算法,還沒有做個總結,呵呵 氣泡排序 氣泡排序是最慢的排序演算法。在實際運用中它是效率最低的演算法。它通過一趟又一趟地比較陣列中的每乙個元素,使較大的資料下沉,較小的資料上公升。它是 o n 2 的演算法。快速排序 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來...