標籤:style blog http color 2014 art
演算法導論在介紹演算法時列舉了插入排序與並歸排序,以此來說明什麼事演算法,演算法效率以及提出了演算法設計中重要的思想--分治,也就是將問題劃分為規模較小的子問題。這種思想在大規模運算時具有顯著的時間開銷優勢,例如插入排序和並歸排序,其時間開銷大致分別等於C1N2和C2Nlog2N。
下面介紹具體的代碼:
首先是插入排序:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace algorithm 7 { 8 class Program 9 {10 class InsertionSortFun11 {12 public void InsertionSort(int[] A)13 {14 int n = A.Length;15 for (int j = 1; j < n; j++) 16 {17 //所要插入的新值18 int key = A[j]; 19 int i = j - 1;20 //將新值與原有序列比較21 while ((i >= 0) && (A[i] > key)) 22 {23 //交換順序24 A[i + 1] = A[i]; 25 i = i - 1;26 }27 //插入新值28 A[i + 1] = key; 29 }30 }31 }32 33 static void Main(string[] args)34 {35 //待排序數組36 int[] X = { 45, 32, 87, 1, 8, 0, 4, 2, 55, 6, 34, 23, 82, 12, 8 };37 //執行個體化插入排序38 InsertionSortFun ISF = new InsertionSortFun();39 ISF.InsertionSort(X);40 //控制台列印輸出41 foreach (int item in X)42 {43 Console.WriteLine(item);44 }45 }46 }47 }
輸出結果為:
接下來是歸併排序:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace algorithm 7 { 8 class Program 9 {10 class MergeSortFun11 {12 //合并函數--用於將兩個已排序的數組合并13 private void Merge(int[] num, int start, int middle, int end)14 {15 int n1 = middle - start + 1;16 int n2 = end - middle;17 18 //聲明兩個數組用來容納左右兩個數組19 int[] L = new int[n1 + 1];20 int[] R = new int[n2 + 1];21 22 //為建立的數組賦值23 for (int i = 0; i < n1; i++) 24 {25 L[i] = num[start + i];26 }27 for (int i = 0; i < n2; i++)28 {29 R[i] = num[middle + i + 1];30 }31 //設定哨兵元素32 L[n1] = 1000000;33 R[n2] = 1000000;34 35 int p = 0;36 int q = 0;37 //進行合并38 for (int k = start; k <= end; k++) 39 {40 if (L[p] <= R[q]) 41 {42 num[k] = L[p];43 p++;44 } 45 else46 {47 num[k] = R[q];48 q++;49 }50 } 51 }52 53 //遞迴函式54 public void MergeSort(int[] num, int start, int end)55 {56 int middle;57 if (start < end) 58 {59 middle = (start + end) / 2;60 //歸併的基本思想61 //左排序62 MergeSort(num, start, middle);63 //右排序64 MergeSort(num, middle + 1, end);65 //合并66 Merge(num, start, middle, end);67 }68 }69 }70 static void Main(string[] args)71 {72 //待排序數組73 int[] X = { 45, 32, 87, 1, 8, 0, 4, 2, 55, 6, 34, 23, 82, 12, 8 };74 //執行個體化歸併排序75 MergeSortFun MSF = new MergeSortFun();76 MSF.MergeSort(X, 0, X.Length - 1);77 //控制台列印輸出78 foreach (int item in X)79 {80 Console.WriteLine(item);81 }82 }83 }84 }
其結果與插入排序結果相同。