#include <string>
typedef int ElementType;
typedef struct Squential {
ElementType *Data;
int Length;
} Squential;
void EnterElement(Squential &List) {
int Len;
int x;
printf("Please input the Element Length:");
scanf("%d", &Len);
fflush(stdin);
List.Length = Len;
List.Data = (ElementType *) malloc(sizeof(ElementType) * List.Length);
for (int i = 0; i < List.Length; ++i) {
scanf("%d", &x);
List.Data[i] = x;
}
}
void PrintList(Squential List) {
for (int i = 0; i < List.Length; ++i) {
printf("%4d", List.Data[i]);
}
printf("\n");
}
//将已排好序的两个列表进行合并
void ComBineList(Squential List,int Low,int Mid,int High){
//建立新的辅助循序表,将List.Data中的元素复制其中
static ElementType *TerminalData;
TerminalData=(ElementType*) malloc(sizeof (ElementType)*List.Length);
for (int l = 0; l < List.Length; ++l) {
TerminalData[l]=List.Data[l];
}
//将两个循序表合并
int i,j,k;
for (i=Low,j=Mid+1,k=i;i<=Mid && j<=High;++k) {
//找到第一个循序表中比较小的元素并排序
if (TerminalData[i]<=TerminalData[j]){
List.Data[k]=TerminalData[i];
i++;
} else{
List.Data[k]=TerminalData[j];
j++;
}
}
//给剩余的元素排序
while (i<=Mid){
List.Data[k]=TerminalData[i];
k++;
i++;
}
while (j<=High){
List.Data[k]=TerminalData[j];
k++;
j++;
}
}
//通过递归,为序列排序并进行合并
void Marge(Squential List,int Low,int High){
if (Low<High){
int Mid;
Mid=(Low+High)/2;
Marge(List,Low,Mid);
Marge(List,Mid+1,High);
ComBineList(List,Low,Mid,High);
}
}
int main() {
Squential List;
EnterElement(List);
PrintList(List);
Marge(List,0,9);
PrintList(List);
return 0;