您的位置:首页 > 其它

算法基础之排序篇-归并排序

2012-08-10 14:00 357 查看
1、算法描述

归并排序是将多个有序序列合并成一个新的有序序列。归并排序又分为两路归并和多路归并。下面以两路归并为例:

操作步骤

(1)、申请空间data,大小为两个待排序列大小的和,设定指针k指向空间头部

(2)、设定两个指针i,j分别指向两个待排序列(data1,data2)的头

(3)、比较data1[i]与data2[j]的大小,如果data1[i]<=data2[j]则data[k]=data1[i],i++,k++,否则data[k]=data2[j],j++,k++

(4)、重复(3),直到某一待排序列已全部被比较完。

(5)、将未比较完的序列按顺序放到data尾部。

2、图例




3、代码

public void sort(int[] data) {
int[] temp = new int[data.length];
for (int i = 0; i < data.length; i++) {
temp[i] = data[i];
}
mergeSort(data, temp, 0, data.length - 1);
}

private void mergeSort(int[] data, int[] temp, int l, int r) {
int mid = (l + r) / 2;
if (l == r)
return;
mergeSort(data, temp, l, mid);
mergeSort(data, temp, mid + 1, r);
for (int i = l; i <= r; i++) {
temp[i] = data[i];
}
int i1 = l;
int i2 = mid + 1;
for (int cur = l; cur <= r; cur++) {
if (i1 == mid + 1)
data[cur] = temp[i2++];
else if (i2 > r)
data[cur] = temp[i1++];
else if (temp[i1] <= temp[i2])
data[cur] = temp[i1++];
else
data[cur] = temp[i2++];
}
}


4、稳定性及复杂度

稳定性:归并排序是稳定的排序。

平均时间复杂度:O(nlongn)

由程序代码可以看到,归并程序先将数组分成2段,直到要比较的数段只有一个值,然后两两合并。经过多次两路归并达到排序的目的。

空间复杂度:O(n)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: