归并排序算法个人理解

来源:互联网 发布:网络公关公司危机公关 编辑:程序博客网 时间:2024/06/16 11:53

如果把排序 当作层次不齐的线条 归并排序 和二分法很像 不断的递归完成分割 直到元素个数为1假设元素个数1有序 再和他右边的伙伴比较 合并 所以 合并的次数 logN 最终合并完成的数 再排序N次 复杂度为N*(logN) 如图分割


#include <stdio.h>#include <stdlib.h>void Merge(int array[], int start, int middle, int end){int i, j, k, n1, n2;n1 = middle - start + 1;              n2 = end - middle; int *L = (int *)malloc(n1 * sizeof(int));int *R = (int *)malloc(n2 * sizeof(int));for (i = 0, k = start; i < n1; i++, k++){L[i] = array[k];//左端取值 }for (i = 0, k = middle + 1; i < n2; i++, k++){R[i] = array[k];//右端取值 }for (k = start, i = 0, j = 0; i < n1 && j < n2; k++){if (L[i] < R[j]){array[k] = L[i];i++;}else{array[k] = R[j];j++;}}//比较插入 if (i < n1){for (j = i; j < n1; j++, k++){array[k] = L[j];}}if (j < n2){for (i = j; i < n2; i++, k++){array[k] = R[i];}}//合并过程 }void MergeSort(int array[], int start, int end){int middle;int i;if (start < end){middle = (start + end) / 2;MergeSort(array, start, middle);MergeSort(array, middle + 1, end);Merge(array, start, middle, end);}}int main(){int i = 0;int a[] = {49, 38, 65, 97, 76, 13, 27};int length = sizeof(a) / sizeof(a[0]);MergeSort(a, 0, length -1);for (i = 0 ; i < length; i++){printf("%d ", a[i]);}printf("\n");return 0;}




原创粉丝点击