归并算法的存储分析
函数分析:
mergesort函数需要四个参数:分别是原数组,起始位置,终止位置,存储数组。在调用时,原数组和存储数组相同,即排序后数据最后仍保留在原数组。
merge函数需要五个参数,它的作用是归并两个有序数组,初始需要五个参数,分别是起始位置,中点,终止位置。
空间存储关系分析:由于归并排序需要额外的空间来存放临时数据,所以在此分析数据在空间中的传递过程。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void merge(int r2[],int low,int mid,int high,int r3[]) {
int i=low;int j= mid +1;int k=low;
while ((i <= mid) && (j <= high)) {
if (r2[i] <= r2[j]) {
r3[k]=r2[i];
++i;
}else {
r3[k]=r2[j];
++j;
}
k++;
}
while (i <= mid) {
r3[k]=r2[i];
k++;
i++;
}
while (j <= high) {
r3[k]=r2[j];
k++;
j++;
}
}/*将本次的临时空间中的数据合并到上一级的临时空间中,在最后一次时,为A*/
void mergesort(int A[],int low,int high,int r3[]) {
int *r2;
r2=(int*)malloc(sizeof(int)*(high-low+1));
if(low==high) r3[low]=A[low];/*如果数组A只有一个元素,则无需排序,此时r3为A,如果大于一个元素,则触发递归,r3在递归过程中使用的是临时存储空间r2,step 2*/
else {
int mid=(low+high)/2;
mergesort(A,low,mid,r2);
mergesort(A,mid+1,high,r2);
merge(r2,low,mid,high,r3);/*将r2中的数据进行归并转移到r3,在递归的最后一步,r3为A,在此之前,r3为临时空间r2,setp 3*/
}
}
int main() {
int length = 0;
int A[100];
int i=1;
char c;
for(;;){
scanf("%d",&A[i]);
length++;
i++;
c = getchar();
if(c=='\n') break;
}
mergesort(A,1,length,A);//数据从A数组转移到A数组,step 1
return 0;
}