归并排序

 1         /// <summary>
 2         /// 归并排序_合并
 3         /// </summary>
 4         /// <param name="v"></param>
 5         /// <param name="first"></param>
 6         /// <param name="mid"></param>
 7         /// <param name="last"></param>
 8         public static int[] Merger(int[] v, int first, int mid, int last)
 9         {
10             Queue<int> tempV = new Queue<int>();
11             int indexA, indexB;
12             //设置indexA,并扫描subArray1 [first,mid]
13             //设置indexB, 并扫描subArray2 [mid,last]
14             indexA = first;
15             indexB = mid;
16             //在没有比较完两个子标的情况下,比较 v[indexA]和v[indexB]
17             //将其中小的放到临时变量tempV中
18             while (indexA < mid && indexB < last)
19             {
20                 if (v[indexA] < v[indexB])
21                 {
22                     tempV.Enqueue(v[indexA]);
23                     indexA++;
24                 }
25                 else
26                 {
27                     tempV.Enqueue(v[indexB]);
28                     indexB++;
29                 }
30             }
31             //复制没有比较完子表中的元素
32             while (indexA < mid)
33             {
34                 tempV.Enqueue(v[indexA]);
35                 indexA++;
36             }
37             while (indexB < last)
38             {
39                 tempV.Enqueue(v[indexB]);
40                 indexB++;
41             }
42             int index = 0;
43             while (tempV.Count > 0)
44             {
45                 v[first + index] = tempV.Dequeue();
46                 index++;
47             }
48             return v;
49         }
50 
51         /// <summary>
52         /// 归并算法
53         /// 原理:把原始数组分成若干子数组,对每一个子数组进行排序,
54         ///       继续把子数组与子数组合并,合并后仍然有序,直到全部合并完,形成有序的数组
55         /// </summary>
56         /// <param name="v"></param>
57         /// <param name="first"></param>
58         /// <param name="last"></param>
59         public static int[] MergerSort(int[] v, int first, int last)
60         {
61             if (first + 1 < last)
62             {
63                 int mid = (first + last) / 2;
64                 MergerSort(v, first, mid);  //数组前一半
65                 MergerSort(v, mid, last);   //数组后一半
66                 v = Merger(v, first, mid, last);  //合并子序列
67             }
68             return v;
69         }
工欲善其事,必先利其器。
原文地址:https://www.cnblogs.com/zhangzhu/p/2836125.html