基本思想:
假设待排序列含有n个元素,可以看成n个有序的子序列,每个字序列的长度为1,然后两两归并,得到n/2(向上取整)个长度为2或1的有序子序列;再两两归并…,重复,直到得到一个长度为n的有序序列,即为(2路归并排序)。
需要递归logn次,且每次不要O(n)的时间,因此总的时间复杂度为O(nlogn),为最好、最快即平均的时间性能。
空间复杂度为O(n)
是一种稳定 的排序算法。
#include <iostream>
#include <cstdlib>
//顺序表结构
#define MAXSIZE 10 //要排序数组个数最大值
typedef struct
{
int r[MAXSIZE + 1]; //存储要排序数组,r[0]作为哨兵或临时变量
int length; //记录顺序表长度
}SqList;
//交换函数
void swap(SqList* L, int i, int j)
{
int temp = L->r[i];
L->r[i] = L->r[j];
L->r[j] = temp;
}
void Merge(int SR[], int TR[], int i, int m, int n)
{
int j, k, l;
for (k = i ,j = m + 1; i <= m && j <= n; k++){
if (SR[i] < SR[j])
TR[k] = SR[i++];
else
TR[k] = SR[j++];
}
if (i <= m){
for (l = 0; l <= m - i; l++)
TR[k + l] = SR[i + l];
}
if (j <= n){
for (l = 0; l <= n - j; l++)
TR[k + l] = SR[j + l];
}
}
void Msort(int SR[], int TR1[], int s, int t)
{
int m;
int TR2[MAXSIZE + 1];
if (s == t) TR1[s] = SR[s];
else
{
m = (s + t) / 2;
Msort(SR,TR2, s, m);
Msort(SR,TR2, m + 1, t);
Merge(TR2, TR1, s, m, t);
}
}
void MergeSort(SqList * L)
{
Msort(L->r, L->r, 1, L->length);
}
void main()
{
SqList data;
int len = 10; //待排序列个数
srand((int)time_t(NULL));
data.r[0] = { 0 };
std::cout << "排序前的数列为:";
for (int i = 1; i <= len; ++i)
{
data.r[i] = rand() % 10 + 1;
std::cout << data.r[i] << ' ';
}
data.length = len;
//Qsort(&data, 1, len);
MergeSort(&data); //快排算法
printf("\n");
std::cout << "排序后的数列为:";
for (int i = 1; i <= len; ++i)
{
std::cout << data.r[i] << ' ';
}
}