归并排序(C语言)。
先上代码,理论会后面一起总结。
1. 递归
2. 非递归
#include <stdio.h> #include <stdlib.h> #include <string.h> void merge_sort(int* arr, int length) { int step = 1; //区间步长 int l[length], r[length]; //gcc, 两个临时数组,分别表示待归并的两个区间 //int l[100], r[100]; //vc while(step < length) { int startloc = 0; //归并区间的开始下标 while(startloc < length - step) { //归 int len_l, len_r; //左右待归并区间的长度 len_l = len_r = step; memcpy(l, arr + startloc, sizeof(int) * len_l); if(startloc + 2 * step > length) { len_r = length - startloc - step; } memcpy(r, arr + startloc + step, sizeof(int) * len_r); //并 int i = 0, j = 0, k = startloc; while(i < len_l && j < len_r) { arr[k++] = l[i] < r[j] ? l[i++] : r[j++]; } while(i < len_l) { arr[k++] = l[i++]; } startloc += 2 * step; } step *= 2; } } int main() { int arr[11] = {-1, 2, 4, -12, 4, 0, 0, 12, 23, -4, 7000}; merge_sort(arr, 11); for(int i = 0; i < 11; ++i) { printf("%d ", arr[i]); } printf("\n"); return 0; }