作者
| zhonglihao
|
算法名
| 归并排序 Merge Sort
|
分类
| 排序
|
复杂度
| nlogn型
|
形式与数据结构
| 伪代码,需要额外增加一个数组 |
特性
|
|
具体参考出处
| 《算法导论》
|
备注
|
|
//将有二个有序数列a[first...mid]和a[mid...last]合并。
void mergearray(int a[], int first, int mid, int last, int temp[])
{
int i = first, j = mid + 1;
int m = mid, n = last;
int k = 0;
while (i <= m && j <= n)
{
if (a[i] <= a[j])
temp[k++] = a[i++];
else
temp[k++] = a[j++];
}
while (i <= m)
temp[k++] = a[i++];
while (j <= n)
temp[k++] = a[j++];
for (i = 0; i < k; i++)
a[first + i] = temp[i];
}
void mergesort(int a[], int first, int last, int temp[])
{
if (first < last)
{
int mid = (first + last) / 2;
mergesort(a, first, mid, temp); //左边有序
mergesort(a, mid + 1, last, temp); //右边有序
mergearray(a, first, mid, last, temp); //再将二个有序数列合并
}
}
bool MergeSort(int a[], int n)
{
int *p = new int[n];
if (p == NULL)
return false;
mergesort(a, 0, n - 1, p);
delete[] p;
return true;
}
/*
1:1 512个, 1次
2:2 256个, 3次
4:4 128个, 7次
8:8 64 15
16:16 32 31
32:32 16 63
64:64 8 127
128:128 4 255
256:256 2 511
512:512 1个, 1023次
time = 9217
nlogn = 10240
节省10%
每次大概是比较n次(分离之后能够每次都有第一个偷鸡,所以效率比较高)
(n/2)*(2-1)+(n/4)*(4-1)+...(n/n)*(n-1);
*/