归并排序算法
1. 问题
对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k。
思路:
二分归并排序是经典的分治算法,分而治之,将长度为n的数组不断划分成n/2的子数组,即将n规模的问题转化成为了n/2规模的子问题,不断划分,当问题规模为1时(长度为1的数组本身就是有序的),将每一个长度为1的子序列进行归并(归并有序表),不断归并就能够实现将长度为n/2的有序表归并得到长度为n的有序表,实现排序。
2.解析
3.设计
void mergeSort(element a[], int left, int right)
{
if (left >= right) return;
middle = (left + right) / 2;
mergeSort(a, left, middle);
mergeSort(a, middle+1, right);
//make left to middle and middle toright is ordered
merge(a, left, middle, right);
}
//归并有序表
void merge(element a[],
int left, int middle, int right)
{
int i = left, j = middle + 1;
while (i <= middle && j <= right) {
if (a[i].key < a[j].key) {
map[index++].key = a[i++].key;
}
else {
map[index++].key = a[j++].key;
}
}
while (i <= middle) {
map[index++].key = a[i++].key;
}
while (j <= right) {
map[index++].key = a[j++].key;
}
for (int k = left; k <= right; k++) {
a[k].key = map[k - left].key;
}
}
4.分析
T(n) = 2 * T(n/2)+n = 4 * T(n/4) + 2n = 8 * T(n/8) + 3n = … … = n * T(1) + (log2n) * n
因为T(1) = 0 故 T(n) = (log2n)*n
所以归并排序的时间复杂度为nlog2n