前段時間因為項目需要,做了個用來對數組排序的類,順便把以前學過的幾種排序算法用C#實現一下。用C#的一些機制來诠釋了一下算法的是實現。在閱讀本之前,需要一些對C#的有些基本的了解,了解方法參數中out ,ref的作用,掌握面向對象的一些基本思想。
1. 插入排序
1.1. 基本思想:
每次將一個待排序的數據元素,插入到前面已經排好序的數列中的適當位置,使數列依然有序;直到待排序數據元素全部插入完為止。
1.2. 排序過程:
【示例】:
[初始關鍵字] [49] 38 65 97 76 13 27 49
(38) [38 49] 65 97 76 13 27 49
(65) [38 49 65] 97 76 13 27 49
(97) [38 49 65 97] 76 13 27 49
(76) [38 49 65 76 97] 13 27 49
(13) [13 38 49 65 76 97] 27 49
(27) [13 27 38 49 65 76 97] 49
(49) [13 27 38 49 49 65 76 97]
1.3. 程序實現
<summary> /// 插入排序算法 /// </summary> /// <param name="dblArray"></param> static void InsertSort(ref double[] dblArray) { for(int i = 1 ; i < dblArray.Length ; i++) { int frontArrayIndex = i-1 ; int CurrentChangeIndex = i ; while(frontArrayIndex>=0) { if(dblArray[CurrentChangeIndex] < dblArray[frontArrayIndex]) { ChangeValue(ref dblArray[CurrentChangeIndex],ref dblArray[frontArrayIndex]); CurrentChangeIndex = frontArrayIndex ; } frontArrayIndex--; } } } /// <summary> /// 在內存中交換兩個數字的值 /// </summary> /// <param name="A"></param> /// <param name="B"></param> static void ChangeValue (ref double A ,ref double B) { double Temp = A ; A = B ; B = Temp ; }
2. 選擇排序
2.1. 基本思想:
每一趟從待排序的數據元素中選出最小(或最大)的一個元素,順序放在已排好序的數列的最後,直到全部待排序的數據元素排完。
2.2. 排序過程:
【示例】:
初始關鍵字 [49 38 65 97 76 13 27 49]
第一趟排序後 13 [38 65 97 76 49 27 49]
第二趟排序後 13 27 [65 97 76 49 38 49]
第三趟排序後 13 27 38 [97 76 49 65 49]
第四趟排序後 13 27 38 49 [49 97 65 76]
第五趟排序後 13 27 38 49 49 [97 97 76]
第六趟排序後 13 27 38 49 49 76 [76 97]
第七趟排序後 13 27 38 49 49 76 76 [ 97]
最後排序結果 13 27 38 49 49 76 76 97
2.3. 程序實現
/// <summary> /// 選擇排序 /// </summary> /// <param name="dblArray"></param> private static void SelectSort(ref double[] dblArray) { for(int i =0 ; i< dblArray.Length; i++) { double MinValue = dblArray[i] ; int MinValueIndex = i ; for(int j = i; j< dblArray.Length; j++) { if(MinValue > dblArray[j] ) { MinValue = dblArray[j] ; MinValueIndex = j ; } } ExChangeValue(ref dblArray[i], ref dblArray[MinValueIndex]); } } /// <summary> /// 交換數據 /// </summary> /// <param name="A"></param> /// <param name="B"></param> private static void ExChangeValue(ref double A , ref double B) { double Temp = A ; A = B ; B = Temp ; }
3. 冒泡排序
3.1. 基本思想:
兩兩比較待排序數據元素的大小,發現兩個數據元素的次序相反時即進行交換,直到沒有反序的數據元素為止。
3.2. 排序過程:
設想被排序的數組R[1..N]垂直豎立,將每個數據元素看作有重量的氣泡,根據輕氣泡不能在重氣泡之下的原則,從下往上掃描數組R,凡掃描到違反本原則的輕氣泡,就使其向上"漂浮",如此反復進行,直至最後任何兩個氣泡都是輕者在上,重者在下為止
【示例】:
49 13 13 13 13 13 13 13
38 49 27 27 27 27 27 27
65 38 49 38 38 38 38 38
97 65 38 49 49 49 49 49
76 97 65 49 49 49 49 49
13 76 97 65 65 65 65 65