本总结是是个人为防止遗忘而作,不得转载和商用。
基本思想
基本思想:将数组A[0…n-1]中的元素分成两个子数组:A1 [0…n/2]和A 2 [n/2+1…n-1]。分别对这两个子数组单独排序,然后将已排序的两个子数组归并成一个含有n个元素的有序数组。
归并排序是稳定的排序,即如果有两个49,则排序后前面的49还在前面,后面的49还在后面。
PS:快速排序和堆排序不稳定。
时间复杂度
O(nlogn)
代码
#include <stdio.h>
int temp[100];
void Merge(int* a, int low, int mid, inthigh)
{
int i = low, j = mid + 1, size = 0;
for( ; (i<=mid)&&(j<=high); size++) {
if(a[i] < a[j]) temp[size] = a[i++];
else temp[size] = a[j++];
}
// 有时会 i 或 j 还有没走到最后的,于是进行补充
while(i <= mid) temp[size++] = a[i++];
while(j<= high) temp[size++] = a[j++];
// 将 temp 拷贝回 a
for(i = 0; i < size; i++) a[low+i] = temp[i];
}
void MergeSort(int* a, int low, int high)
{
if(low >= high) return;
int mid = (low+high) / 2;
// 从 low 到 mid 排序
MergeSort(a, low, mid);
// 从 mid + 1 到 high 排序
MergeSort(a, mid+1, high);
// 归并
Merge(a, low, mid, high);
}
int main(){
int a[] = {3, 56, 2, 7, 45, 8, 1};
int size = sizeof(a) / sizeof(int);
int i = 0;
// 对 a 进行排序,从 0 排序到 size - 1
MergeSort(a, 0, size-1);
for(; i < size; i++ ) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}