归并排序
-
什么是归并排序
归并排序是将两个或者两个以上的有序表合并成一个有序表的过程。 -
归并排序的算法思想
假设初始序列含有n个记录,则可以看成n个有序的序列,每个子序列的长度为1,然后两两归并,得到[n/2]个长度为2或1的有序子序列;再两两归并,如此重复,直至得到一个长度n的有序序列为止。 -
图例
-
代码实现
#include<iostream>
using namespace std;
#define MAXSIZE 20
typedef int KeyType;
typedef struct
{
KeyType key;//关键字
int other;//其他信息
}RedType;
typedef struct
{
RedType r[MAXSIZE];
int length;
}SqList;
void CreateSqList(SqList& L)
{
cout << "表的长度:";
cin >> L.length;
cout << "表的关键字信息:";
for (int i = 0; i < L.length; i++)
{
cin >> L.r[i].key;
}
}
//比较函数
void Merge(RedType R[], RedType T[], int low, int mid, int high)
{
int i = low, j = mid + 1, k = low;
while (i <= mid && j <= high)//将R中记录由小到大放入T中
{
if (R[i].key <= R[j].key) T[k++] = R[i++];
else T[k++] = R[j++];
}
while (i <=mid)//剩余的R[i..mid]放入T中
{
T[k++] = R[i++];
}
while (j <= high)//剩余的R[j...high]放入T中
{
T[k++] = R[j++];
}
}
//比较函数
//归并排序
void MSort(RedType R[], RedType T[], int low, int high)
{
if (low == high) T[low] = R[low];
else
{
RedType S[MAXSIZE];
int mid = (low + high) / 2;//序列一分为二
MSort(R,S,low, mid);//对前半部分进行归并排序
MSort(R,S,mid + 1, high);//对后半部分进行归并排序
Merge(S, T, low, mid, high);//合并
}
}
//归并排序
void Sort(SqList& L)
{
MSort(L.r, L.r, 0, L.length - 1);
}
void Show(SqList L)
{
for (int i = 0; i < L.length; i++)
{
cout << L.r[i].key << " ";
}
}
int main()
{
SqList L;
CreateSqList(L);
Sort(L);
cout << "排好序的表为:";
Show(L);
return 0;
}