(1)背景——合并2个有序数组
合并两个有序数组非常简单,只要依次比较两个数组中的数据,较小的放入结果数组中并指针后移,直至移至某一个数组的结尾,再将另一个数组所有数据放入结果数组即可
private static void merge(int[] a, int[] b, int[] c)
{
int i=0;
int j=0;
int k=0;
while(i<a.length && j<b.length)
{
if(a[i]<b[j])
c[k++] = a[i++];
else
c[k++] = b[j++];
}
while(i<=a.length-1)
c[k++] = a[i++];
while(j<=b.length-1)
c[k++] = b[j++];
}
(2)思路
将数组分为A、B,如果这两个数组内的数据是有序的,那么直接合并就可以了。那么如何让这两个数组有序呢?可以再将A、B各自再分为2组,以此类推,直至分出来的小组中只有一个数字时,那么就可以认为这个小数组已经是有序的了,再合并小数组即可。这样先递归的分解数列,再合并数列,就完成了归并排序。
(3)代码
private static void binary_sort(int[] a,int begin, int end, int[] temp)
{
if(begin < end)
{
int mid = (begin+end)/2;
binary_sort(a, begin, mid, temp);
binary_sort(a, mid+1, end, temp);
merge(a,begin,mid,end,temp);
}
}
private static void merge(int[] a, int begin,int mid, int end, int[] temp)
{
int i = begin;
int j = mid+1;
int k = begin;
while(i<=mid && j<=end)
{
if(a[i]<a[j])
temp[k++] = a[i++];
else
temp[k++] = a[j++];
}
while(i<=mid)
temp[k++] = a[i++];
while(j<=end)
temp[k++] = a[j++];
for(int m=begin; m<=end; m++)
a[m] = temp[m];
}