資料結構中的排序演算法
當待排序序列基本有序時優先選擇簡單排序,快速排序平均次數少於堆排序
1 插入排序
1) 直接插入排序
第一次將位置0和位置1進行比較,小的放前。
第二次將位置2上的數字,插入到位置0和位置1中。
… 第k次將位置k上的數字,插入到第k-1次已經完成的序列中。
52 6 0 3 9 1 7 4 8
一趟 2 5
6 0 3 9 1 7 4 8
二趟 2 5 6
0 3 9 1 7 4 8
三趟 0 2 5 6
3 9 1 7 4 8
四趟 0 2 3 5 6
9 1 7 4 8
五趟 0 2 3 5 6 9
1 7 4 8
六趟 0 1 2 3 5 6 9
7 4 8
七趟 0 1 2 3 5 6 7 9
4 8
八趟 0 1 2 3 4 5 6 7 9
8九趟 0 1 2 3 4 5 6 7 8 9
2)希爾排序
先將整個待排元素序列分割成若干個子串行(由相隔某個「增量」的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。
49 38 65
9776
1327
4955
04第一趟增量5 13
27 49 55
0449
3865 97 76
第二趟增量3 13 04 49 38 27 49 55 65 97 76
第三趟增量1 04 13 27 38 49 49 55 65 76 97
2 選擇排序
選擇排序每一趟從待排序的資料元素中選出最小(或最大)的乙個元素,第i趟確定最小元素的時候會通過不斷地比較選擇最小值與第i個位置元素交換
每次都是遍歷一遍剩下要排序的部分,找出其最大值或最小值。關鍵碼比較次數與記錄地初始排列無關
1)直接選擇排序o(
n2)'>
第一次取區間[0,n],選擇該區間最小的數和位置0的數進行交換;
第二次取區間[1,n],選擇該區間最小的數和位置1的數進行交換;
第三次取區間[2,n],選擇該區間最小的數和位置2的數進行交換;
依次往下,可以得到排序,這就是選擇排序。o(
n2)'>ex
8 5 9 3 7o(
n2)'>o(n
2)'>遍歷1號
3 5 9 8 7o(
n2)'>o(n
2)'>遍歷2號
3 5 9 8 7o(
n2)'>o(n
2)'>遍歷3號
3 5 7 8 9o(
n2)'>o(n
2)'>o(n
2)'>遍歷4號
3 5 7 8 9
2)堆排序
3 交換排序
1)氣泡排序
第0趟交換
34 23 1 2
34 23 1 2
341 23 2
1 34 23 2
第1趟交換
1 34 23 2
1 34
2 23
1 2 34 23
第2趟交換
1 2 34 23
1 2 23 34
public class bubblesort {public static void sort(long arr) {
long tmp=0;
//i趟交換,為第i個位置賦值
for (int i = 0; i < arr.length-1; i++) {
for (int j = arr.length-1; j > i; j--) {
if (arr[j]
2)快速排序
1從序列當中選擇乙個基準數(pivot)
2將序列當中的所有數依次遍歷,比基準數大的位於其右側,比基準數小的位於其左側
重複步驟1.2,直到所有子集當中只有乙個元素為止。
4 歸併排序
總結資料結構中重要的排序演算法
1 直接插入排序 適合資料較小且資料較有序的數字序列。演算法思想 將乙個陣列先劃分成已排序好的部分和未排序好的部分,從未排序好的部分中獲取乙個關鍵數作為待排序數,在 已 排好序的序列中找到合適位置插入這個資料。需要乙個中間變數tmp存放每次獲取的關鍵數。程式 如下 void insertsort i...
資料結構排序演算法總結
常用的演算法有插入排序 氣泡排序 選擇排序 快速排序 歸併排序 希爾排序 堆排序 計數排序和基數排序。下面對著九種常見排序方法進行總結 排序方法 時間複雜度 空間複雜度 個人評價 插入排序 o n 2 o 1 選擇排序 氣泡排序 希爾排序 o n log n 快速排序 o log n 歸併排序 o ...
資料結構 排序演算法總結
1 二路歸併排序 二路歸併排序 思路 利用分治思想,對原陣列進行二分分段,使元素在每一小段內有序,然後逐漸合併 如,最小分段是2,先2內有序,合併為4,4內有序。時間複雜度 o nlogn 空間複雜度 o n 需要乙個額外的陣列作為臨時儲存 static void mergesort int arr...