------------二路归并排序
思想:分治,将每一个无序数组分为两个数组,分别把这两个数组排序然后再合起来就是一个有序数组,运用了递归思想
最好情况:O(nlgn)
最坏情况:O(nlgn)(选出的a[0]为最大或者最小元素)
平均:O(nlgn)
空间复杂度:O(n)
稳定性:稳定排序
仅适用于顺序表,可用作外部排序中
#include<iostream>
using namespace std;
int a[8] = { 100, 5, 3, 1, 8, 7, 2, 4 };
int b[8]; //需要额外等大小的数组储存合并结果
void hebing(int a[], int x, int m, int c, int temp[])
{
int i = 0;
int j = 0;
int p1 = x;
int p2 = m + 1; //p1,p2为两个序列开始元素
while (p1 <= m&&p2 <= c)
{
if (a[p1] < a[p2])
temp[i++] = a[p1++];
else
temp[i++] = a[p2++];
}
while (p1 <= m)
temp[i++] = a[p1++];
while (p2 <= c)
temp[i++] = a[p2++];
for (j = 0; j < c-x+1; j++) //放回原数组
{
a[x+j] = temp[j];
}
}
void twosort(int a[],int x,int c,int temp[])//二路归并:将左边的序列twosort,再将右边的twosort,最后将左右两边合并在一个数组
{
if (x< c){ //递归停止条件
int m = x + (c - x) / 2;
twosort(a, x, m, temp);
twosort(a, m + 1, c, temp);
hebing(a, x, m,c,temp); //把下表从x到m的序列和下标从m+1到c的序列合并
}
}
void quicksort(int *a, int n)
{}
int main(){
int n = sizeof(a) / sizeof(int);
twosort(a, 0, n - 1, b);
cout << "排序后数组为:" << endl;
for (int i = 0; i < 8; i++)
cout << a[i] << " ";
return 0;
}
ps:二路归并主要是利用递归思想,不过注意排序下标,弄错了递归程序调试挺麻烦的