首先回顧下各種排序的主要思路:
一. 氣泡排序
示例**:
氣泡排序主要思路是:public static void bublesort(int a)
}} }
通過交換使相鄰的兩個數變成小數在前大數在後,這樣每次遍歷後,最大的數就「沉」到最後面了。重複n次即可以使陣列有序。
氣泡排序改進1:在某次遍歷中如果沒有資料交換,說明整個陣列已經有序。因此通過設定標誌位來記錄此次遍歷有無資料交換就可以判斷是否要繼續迴圈。
氣泡排序改進2:記錄某次遍歷時最後發生資料交換的位置,這個位置之後的資料顯然已經有序了。因此通過記錄最後發生資料交換的位置就可以確定下次迴圈的範圍了。
二. 插入排序
示例**:
直接插入排序主要思路是:public static void insertsort(int a)
a[j + 1] = tmp;
}} }
每次將乙個待排序的資料,插入到前面已經排好序的序列之中,直到全部資料插入完成。
三. 希爾排序
示例**:
希爾排序主要思路是:public static void sheersort(int a)
a[k + gsp] = tmp;}}
}} }
先將整個待排元素序列分割成若干個子串行(由相隔某個「增量」的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。由於希爾排序是對相隔若干距離的資料進行直接插入排序,因此可以形象的稱希爾排序為「跳著插」
四. 歸併排序
示例**:
歸併排序主要思路是:public static void mergaarray(int a, int start, int mid, int end, int tmp) else
} while (i <= j)
while (m <= n)
for (int k2 = 0; k2 < k; k2++)
} public static void mergasort(int a, int start, int end, int tmp)
}
當乙個陣列左邊有序,右邊也有序,那合併這兩個有序陣列就完成了排序。如何讓左右兩邊有序了?用遞迴!這樣遞迴下去,合併上來就是歸併排序。
五. 快速排序
示例**:
快速選擇排序主要思路是:public static void quicksort(int a, int start, int end)
if (l < r)
while (l < r && a[l] < tmp)
if (l < r)
}a[l] = tmp;
if (start < l - 1)
if (l + 1 < end)
} }
「挖坑填數+分治法」,首先令i =l; j = r; 將a[i]挖出形成第乙個坑,稱a[i]為基準數。然後j--由後向前找比基準數小的數,找到後挖出此數填入前乙個坑a[i]中,再i++由前向後找比基準數大的數,找到後也挖出此數填到前乙個坑a[j]中。重複進行這種「挖坑填數」直到i==j。再將基準數填入a[i]中,這樣i之前的數都比基準數小,i之後的數都比基準數大。因此將陣列分成二部分再分別重複上述步驟就完成了排序。
六. 堆排序
示例**:
堆排序主要思路用張圖示來表示更好:見截圖「堆排序」public static int leftchild(int i)
public static void fromtoptodown(int a, int i, int size)
if (a[child] > tmp) else
} a[i] = tmp;
} public static void heapsort(int a)
for (int i = 0; i < a.length; i++)
}
可見堆排序的難點就在於堆的的插入和刪除。
堆的插入就是——每次插入都是將新資料放在陣列最後,而從這個新資料的父結點到根結點必定是乙個有序的數列,因此只要將這個新資料插入到這個有序數列中即可。
堆的刪除就是——堆的刪除就是將最後乙個資料的值賦給根結點,然後再從根結點開始進行一次從上向下的調整。調整時先在左右兒子結點中找最小的,如果父結點比這個最小的子結點還**明不需要調整了,反之將父結點和它交換後再考慮後面的結點。相當於從根結點開始將乙個資料在有序數列中進行「下沉」。
因此,堆的插入和刪除非常類似直接插入排序,只不是在二叉樹上進行插入過程。所以可以將堆排序形容為「樹上插」
最後總結下經典排序演算法之間的關係:
經典排序演算法總結
排序演算法是離散數學和資料結構學科最基本的演算法,雖然知道這些排序演算法的名字,但是一直沒有研究過它們的實現原理。現在把它們收集起來,並一一親自實現,來加深對排序演算法的理解。1,氣泡排序 最簡單的排序演算法,從第乙個元素開始比較相鄰元素大小,如果前邊元素大於後邊元素則交換位置,否則將下標移到下乙個...
經典排序演算法總結
插入排序 選擇排序 歸併排序 排序方法 平均情況 最好最差 空間複雜度 穩定性氣泡排序o n2 o n 2 o n o n o n2 o n 2 o 1 o 1 穩定快速排序o nlogn o nlog n o nlogn o nlog n o n2 o n 2 o nlogn o nlog n 不...
經典排序演算法複習總結
前置定義 in place sort 不占用額外記憶體或占用常數的記憶體 插入排序 選擇排序 氣泡排序 堆排序 快速排序。out place sort 歸併排序 計數排序 基數排序 桶排序。stable sort 插入排序 氣泡排序 歸併排序 計數排序 基數排序 桶排序。unstable sort ...