文章目錄
一、 簡單排序方法1.直接插入排序
基本思想:順序地將待排序的記錄按其關鍵碼的大小插入到已排序的記錄子序列的適當位置。
演算法代碼:
//直接插入排序 public static void InsertSort(SeqList<int> seq) { if (seq.IsEmpty() || seq.GetLength() == 1) return; Console.Write("1.1 簡單排序 排序前:"); seq.Display(); int tmp; for (int i = 1; i < seq.GetLength(); i++) { if (seq[i] < seq[i - 1]) { tmp = seq[i]; int j; for (j = i - 1; j >= 0 && tmp < seq[j]; j--) { seq[j + 1] = seq[j]; } seq[j + 1] = tmp; } Console.Write("i={0} ", i); seq.Display(); } }
備忘:這裡的SeqList<T>是自訂順序表,這裡就不詳述了。
直接插入排序時間複雜度與順序表的有序性有關,基本在o(n)到o(n2)之間。該演算法是穩定的。若排序記錄的數目 n 較小(如 n≤50)時,可採用直接插入排序或簡
單選擇排序。
2.冒泡排序
基本思想:將相鄰的記錄的關鍵碼進行比較,如果前面記錄的關鍵碼大於後面記錄的關鍵碼,則將它們交換,否則不交換。
演算法代碼:
//冒泡排序 public static void BubbleSort(SeqList<int> seq) { if (seq.IsEmpty() || seq.GetLength() == 1) return; Console.Write("1.2 冒泡排序 排序前:"); seq.Display(); int tmp; for (int i = 0; i < seq.Last;i++) { for (int j = seq.Last-1; j >= i; j--) { if (seq[j + 1] <seq[j]) { tmp = seq[j]; seq[j] = seq[j + 1]; seq[j + 1] = tmp; } } Console.Write("i={0} ", i); seq.Display(); } }
時間複雜度:最好O(n),最壞O(n^2)。它是穩定的。
3.簡單排序演算法
基本思想:每一趟在n-i+1(i=1,2,…,n-1)個記錄中選取關鍵字最小的記錄作為有序序列的第i個記錄。
演算法代碼:
//簡單選擇排序 public static void SimpleSelectSort(SeqList<int> seq) { if (seq.IsEmpty() || seq.GetLength() == 1) return; Console.Write("1.3 簡單選擇排序 排序前:"); seq.Display(); int tmp; int index; for (int i = 0; i < seq.Last; i++) { index = i; for (int j = i; j <= seq.Last; j++) { if (seq[j] < seq[index]) { index = j;//找到最小元素下標 } } tmp = seq[i];//交換 seq[i] = seq[index]; seq[index] = tmp; Console.Write("i={0} ", i); seq.Display(); } }
時間複雜度:O(n^2),它是穩定的排序。若記錄的初始狀態已經按關鍵碼基本有序,可採用直接插入排序或冒泡排序。
二、快速排序
基本思想:通過不斷比較關鍵碼,以某個記錄為界(該記錄稱為支點) ,將待排序列分成兩部分。其中,一部分滿足所有記錄的關鍵碼都大於或等於支點記錄的關鍵碼,另一部分記錄的關鍵碼都小於支點記錄的關鍵碼。把以支點記錄為界將待排序列按關鍵碼分成兩部分的過程,稱為一次劃分。對各部分不斷劃分,直到整個序列按關鍵碼有序為止。
演算法代碼:
//快速排序,遞迴,以第一個元素為支點 public static void QuickSort(SeqList<int> seqlist, int low, int high) { int tmplow = low;//臨時儲存開頭元素索引 int tmphigh = high;//臨時儲存結束元素索引 int tmp = seqlist[low]; if (low >= high) return; while (low < high) { while (low < high && seqlist[high] >= tmp) high--; seqlist[low] = seqlist[high]; while (low < high && seqlist[low] <= tmp) low++; seqlist[high] = seqlist[low]; } seqlist[low] = tmp; seqlist.Display(); QuickSort(seqlist, tmplow, low - 1); QuickSort(seqlist, low + 1, tmphigh); }
時間複雜度:快速排序方法的平均效能最好,時間複雜度為O(nlog2n),當待排序序列已經按關鍵碼隨機分布時,快速排序是最適合的。但快速排序在最壞情況下時間複雜度是O(n2)。快速排序方法是不穩定的排序方法。