归并排序
1,基本思想
将两个或两个以上的有序表合并成一个新的有序表。(本文所指内容为两路归并排序)
两路归并:将原始序列中的两个有序表,归并成一个有序表,存在于另一个对象序列中。
迭代的归并排序算法:将初始序列中的n个对象,看成n个长度为1的有序子序列,先做两两归并,得到int(n/2)个长度为2的归并项(如果n为奇数,则最后一个有序子序列为1);在做两两归并,重复直到最后得到一个长度为n的有序序列。
2,代码实现
归并两个序列
//将两个数组进行归并
void merge(int data[], int res[], int left, int mid, int right)
{
int i = left;//左序列指针
int j = mid + 1;//右序列指针
int t = 0;
while (i <= mid && j <= right) {
if (data[i] <= data[j]) {
res[t++] = data[i++];
}
else {
res[t++] = data[j++];
}
}
while (i <= mid) {//将左边剩余元素填充进res中
res[t++] = data[i++];
}
while (j <= right) {//将右序列剩余元素填充进res中
res[t++] = data[j++];
}
//将归并后的数组的值赋给data
for (i = 0; i < t; i++)
data[left + i] = res[i];
}
递归的归并整个数组
//递归的对整个数组进行归并排序
void mergeSort(int data[], int res[], int s, int e)
{
if (s < e)
{
int m = (s + e) / 2;
mergeSort(data, res, s, m);
mergeSort(data, res, m + 1, e);
merge(data, res, s, m, e);
}
测试
int main()
{
int data[] = {2,5,4,7,5,3,1,9,7,6,2,4};
int res[12] = { 0 };
cout << "初始序列:" << endl;
for (int i = 0; i < 12; ++i)
cout << data[i] << " ";
cout << endl;
cout << "每趟后的data:" << endl;
mergeSort(data, res, 0,11);
cout << "排序后:";
for (int i = 0; i <12; ++i)
cout << res[i] << " ";
cout << endl;
return 0;
}
运行结果:
3,性能分析
①时间复杂度为O(nlogn)
一趟归并的时间复杂度为O(n),一共进行int(log2n)趟。
②空间复杂度
o(n)
需要一个同样大小的辅助数组。
③稳定性
稳定