目录
归并排序
1.基本思想
归并排序是建立在归并操作上的一种有效排序算法,该方法是采用和分治法的一个典例。
即将已知有序的子序列进行合并,合并完成之后得到一个完全且有序的序列。
若将一个序列进行排列,归并排序和核心步骤便是将原序列分解成子列,然后对这些子列分别进行排序,子列有序之后,对子列进行合并,最终得到的序列便是序列的有序序列。
2.特性总结
- 归并排序需要格外的空间,所以重点在于解决磁盘的外排序问题;
- 时间复杂度:O(N*logN);
- 空间复杂度:O(N);
- 稳定性:稳定
3.代码实现
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
void MergeData(int arr[], int left, int mid, int right, int *temp){
int begin1 = left;
int end1 = mid;
int begin2 = mid;
int end2 = right;
int index = left;
while (begin1 < end1 && begin2 < end2){
if (arr[begin1] <= arr[begin2]){
temp[index++] = arr[begin1++];
}
else{
temp[index++] = arr[begin2++];
}
}
while (begin1 < end1){
temp[index++] = arr[begin1++];
}
while (begin2 < end2){
temp[index++] = arr[begin2++];
}
}
void MergeSortOP(int arr[], int left, int right, int* temp){
if (right - left <= 1){
return;
}
int mid = left + ((right - left) >> 1);
MergeSortOP(arr, left, mid, temp);
MergeSortOP(arr, mid, right, temp);
MergeData(arr, left, mid, right, temp);
memcpy(arr + left, temp + left, (right - left) * sizeof(int));
}
void MergeSort(int arr[], int size){
int* temp = (int*)malloc(sizeof(int)* size);
if (NULL == temp){
assert(0);
return;
}
MergeSortOP(arr, 0, size, temp);
free(temp);
}
void PrintSort(int arr[], int size){
for (int i = 0; i < size; i++){
printf("%d ", arr[i]);
}
printf("\n");
}
int main()
{
int arr[9] = { 1, 3, 5, 7, 8, 9, 6, 4, 2 };
int size = sizeof(arr) / sizeof(arr[0]);
MergeSort(arr, size);
PrintSort(arr, size);
return 0;
}
值得注意的是,归并排序中存在函数嵌套,函数嵌套的操作需要对函数的实现闲后顺序加以考虑,否则则会出现编译器报错的问题。