归并排序

来源:互联网 发布:数据库三大范式详解 编辑:程序博客网 时间:2024/05/17 04:42
归并排序重点在于合并俩个有序子数组,思想来自于怎么合并俩个有序数组,这里只不过这俩个数组是同一个数组的前后
两部分而已.
比如 0 1 3 2 4 所以mid=2 俩部分就是0 1 3和 2 4 ,依次比较放入新数组(0 2)取0,然后(1 2)取1,然后(3,2)取2,然后(3,4)取3,这样第一部分取完了,剩下的4直接赋值就行了
private static void merge(int a[], int start, int mid, int end) {
int i = start, j = mid + 1;
int k = 0;
int temp[] = new int[a.length];
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 = 0; m < k; m++)
a[start + m] = temp[m];//合并好的重新放回去
}
然后就是怎么将一个数组的前后俩部分变成有序的,理由是当数组只有一个数的时候肯定是有序的,这时候只要递归到俩部分都只剩一个数的时候,便可以认为是有序数组的合并了.
public static void mergeSort(int a[], int start, int end) {
int mid = (start + end) / 2;//以中间的数分割为俩部分
if (start < end) {
mergeSort(a, start, mid);
mergeSort(a, mid + 1, end);
merge(a, start, mid, end);
}
}
0 0
原创粉丝点击