#include <iostream>
#define MAX_SIZE 100
using namespace std;
typedef int keytype;
typedef struct records //排序类型
{
keytype key;
//fields other;
};
typedef records LIST[MAX_SIZE]; //排序数组
/*
设A[left],…,A[mid]是一个已经排序的数据序列,A[mid + 1],…,A[right]是按照同一关键字
排序的另一个已经排序的数据序列。如下函数merge()把这两个排序序列合并在一起,形成一个
排序序列B[left],…,B[right]。
*/
void Merge(int left, int mid, int right, LIST A, LIST B)
{
int i = left;
int j = mid + 1;
int k = left;
while (i <= mid && j <= right)
B[k++] = (A[i].key <= A[j].key) ? A[i++] : A[j++];
while ( i <= mid )
B[k++] = A[i++];
while ( j <= right )
B[k++] = A[j++];
}
/*
应用归并两个排序序列的函数Merge(),写出执行一遍归并的函数Mpass()。该函数把数组A中长度分别为
len的相邻两个子序列归并成长度为2*len的一个序列,把归并的结果存入数组B,n是A中记录的总个数。
*/
void Mpass(int n, int len, LIST A, LIST B)
{
/*
把A中长度均为len的相邻两个已排序子序列归并入B,n为A中记录的总个数
*/
int i, t;
i = 1;
while( i <= (n - 2*len + 1))
{
Merge(i, i+len-1, i+2*len-1, A, B);
i = i + 2*len;
}
if( (i+len-1) < n )//归并长度小于2*len的部分
{
Merge( i, i+len-1, n, A, B);
}
else
{
for(t = i; t <= n; t++)
B[t] = A[t];
}
}
void Sort(int n, LIST A)
{
int len;
LIST B;
len = 1;
while(len < n)
{
Mpass(n, len, A, B);
len = 2*len;
Mpass(n, len, B, A);
len = 2*len;
}
}
int main()
{
LIST list_a;
int i, j;
cout << "列表1长度:" << endl;
cin >> list_a[0].key;
for(i = 1; i <= list_a[0].key; i++)
cin >> list_a[i].key;
Sort(list_a[0].key, list_a);
for(i = 1; i <= list_a[0].key; i++)
cout << list_a[i].key << " ";
return 0;
}
[数据结构] 归并排序算法
最新推荐文章于 2024-08-14 09:00:00 发布