使用语言:c语言,编译器visual studio 2017
一.基本思想
从上到下的归并排序的基本思想主要分成三步。(1)分解:将序列大致分成长度相等的两部分,再运用递归使其越分越细,直到分成单个元素;(2)排序:根据大小关系将相邻两个元素排好序;(3)合并:将两个有序序列合成一个有序序列,直到合成完整的序列。
图例:
二.代码实现
#include<stdio.h>
#include<malloc.h>
void Merge(int array[],int start,int mid,int end) {//将array中两个有序部分合成一个
int *temp = (int*)malloc((end - start + 1) * sizeof(int));
int i = start;
int j = mid + 1;
int k = 0;
while (i <= mid && j <= end) {
if (array[i] <= array[j]) {
temp[k++] = array[i++];
}
else {
temp[k++] = array[j++];
}
}
while (i <= mid) {
temp[k++] = array[i++];
}
while (j <= end) {
temp[k++] = array[j++];
}
for (i = 0; i < k; i++) {
array[start + i] = temp[i];
}
free(temp);
}
void MergeSort(int array[], int start, int end) {//用于划分数组
if (array == NULL || start >= end) return;
int mid = (start + end) / 2;
MergeSort(array, start, mid);//递归地划分左边的数组
MergeSort(array, mid + 1, end);//递归地划分右边的数组
Merge(array, start,mid, end);//将左右有序部分合成一个
}
int main() {
int array[100];
int i = 0;
int num = 0;
printf("请输入待排序的数字个数:\n");
scanf_s("%d", &num);
printf("请输入%d个数字:\n", num);
for (i; i<num; i++) scanf_s("%d", &array[i]);
int start = 0;
int end = i - 1;
MergeSort(array, start, end);
printf("归并排序后的序列为:\n");
for (i = 0; i < num; i++) {
printf("%d ", array[i]);
if (i == num - 1) {
printf("\n");
}
}
return 0;
}
三.时间复杂度分析
假设函数MergeSort需要时间T(N)。因为Merge()函数的时间复杂度为O(N),所以T(N)=2T(N/2)+O(N)。推导得时间复杂度均为O(NlogN)。或者这么理解:归并排序的形式就是一棵二叉树,它需要遍历的次数就是二叉树的深度,而根据完全二叉树的可以得出它的时间复杂度是O(N*logN)。