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 的演算法。快速排序 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來...