//2-路归并排序排序(元素用线性表存储)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define InitiaSize 10
//定义动态线性表
typedef struct{
int* data; //数据域
int len; //线性表当前长度
int MaxSize; //线性表最大容量
}SqList;
//初始化并对线性表随机赋值
bool InitiaList(SqList &L){
int len;
printf("请输入你想要的线性表的长度:");
scanf("%d",&len);
while(len < 0){
printf("您输入的长度不规范,请重新输入!\n");
scanf("%d",&len);
}
if(len <= InitiaSize){
L.data = (int*)malloc(sizeof(int)*InitiaSize);
L.len = len;
L.MaxSize = InitiaSize;
}
else{
L.data = (int*)malloc(sizeof(int)*len);
L.len = len;
L.MaxSize = len;
}
printf("线性表初始化完毕!当前长度是%d,最大容量是%d\n",L.len,L.MaxSize);
int i;
printf("接下来对线性表进行随机赋值:\n");
srand(time(NULL));
for(i = 0; i < L.len; i++){
L.data[i] = rand()%100;
}
printf("随机赋值操作执行完毕!\n");
return true;
}
//读取线性表的内容
void PrintList(SqList &L){
if((L.len == 0)||(L.MaxSize == 0)){
printf("此线性表为空,无法进行读取操作!\n");
return;
}
int i;
for(i = 0; i < L.len; i++){
if(i == L.len - 1){
printf("%d\n",L.data[i]);
}
else{
printf("%d ",L.data[i]);
}
}
printf("线性表内容读取完毕!该线性表长度是%d,最大容量是%d。\n",L.len,L.MaxSize);
}
//归并排序 2路归并
void Merge(SqList &L, int l, int mid, int r, int* Arr){
int i, j, k;
for(i = l; i <= r; i++){
Arr[i] = L.data[i]; //赋值线性表的内容
}
for(i = l, j = mid + 1, k = i; (i <= mid)&&(j <= r); k++){
if(Arr[i] <= Arr[j]){ //谁小就先进入
L.data[k] = Arr[i++];
}
else{
L.data[k] = Arr[j++];
}
}
while(i <= mid){L.data[k++] = Arr[i++];}
while(j <= r){L.data[k++] = Arr[j++];}
}
void MergeSort(SqList &L, int l, int r){
if((L.len == 0)||(L.MaxSize == 0)){
printf("此线性表为空,无法进行归并排序!\n");
return;
}
if(l < r){
int mid = (l + r)/2; //将线性表分成两组
int* Arr;
Arr = (int*)malloc(sizeof(int)*L.len); //建立一个辅助数组
MergeSort(L, l, mid); //对左半部分进行归并排序
MergeSort(L, mid + 1, r); //对右半部分进行归并排序
Merge(L, l, mid, r, Arr); //对已经排好序的两部分数组进行合并
free(Arr);
}
}
int main(){
SqList L; //定义一个线性表
InitiaList(L); //对线性表进行初始化并随机赋值
PrintList(L); //输出线性表内容
clock_t T; //对选择排序所花费的时间进行记录
printf("即将进行归并排序!\n");
T = clock();
MergeSort(L, 0, L.len - 1);
T = clock();
PrintList(L); //输出线性表内容
printf("归并排序执行完毕!\n");
printf("此次排序花费了%lf s\n",((float)T)/CLOCKS_PER_SEC);
return 0;
}
//上述代码如有错误,还请在评论区指正,感谢大家!
08-15
1948
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
05-19
4592
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
03-20
7150
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
06-07