演算法思想:將一個數列劃分為較小的部分,並使每一部分有序,然後將這些較小的有序部分合并。
下面實現,二路歸併排序。
C#實現:
/// <summary> /// 二路歸併排序(分治法排序) /// </summary> /// <param name="soure">源數組</param> /// <param name="begin">數組的起始元素下標0</param> /// <param name="end">數組的最後一個元素的下標source.Length-1</param> private void merge_sort(int[] soure,int begin,int end) { if (begin < end) //遞迴終止條件 { int middle = (begin + end)/2; //計算中間位置 merge_sort(soure, begin, middle); //對左半部分遞迴排序 merge_sort(soure, middle + 1, end); //對右半部分遞迴排序 merge(soure, begin, middle, end); //合并左右兩部分的排序結果 } } /// <summary> /// 對兩個有序序列進行合并 /// </summary> /// <param name="soure">源數組</param> /// <param name="begin">起始位置</param> /// <param name="middle">中間位置</param> /// <param name="end">終止位置</param> private void merge(int[] soure,int begin,int middle,int end) { int n1 = middle - begin + 1; //左半部分元素個數 int n2 = end - middle; //右半部分元素個數 int[] left = new int[n1+1]; //存放左半部分元素,最後一個元素為哨兵位,標識左半部分結束 int[] right = new int[n2+1]; //存放右半部分元素 int i = 0, j = 0; for (i = 0; i < n1;i++ ) { left[i] = soure[begin + i]; } left[left.Length - 1] = int.MaxValue; //哨兵位賦值 for (j =0; j < n2;j++ ) { right[j] = soure[middle + 1 + j]; } right[right.Length - 1] = int.MaxValue; i = 0; j = 0; for(int k=begin;k<=end;k++) //合并左右兩部分到源數組 { if(left[i]<=right[j]) { soure[k] = left[i]; if(left[i]!=int.MaxValue) i++; } else { soure[k] = right[j]; if(right[j]!=int.MaxValue) j++; } } }