归并排序
来源:互联网 发布:汽车电路仿真软件 编辑:程序博客网 时间:2024/05/10 09:47
#include <stdio.h>#include <stdlib.h>#include<assert.h>#include<time.h>void Show(int *arr,int len){ for (int i = 0; i < len; i++) { printf("%d ", arr[i]); } printf("\n");}void Merge(int *arr, int len, int wide)//wide就是几个数字一合并{ int L1 = 0; int H1 = L1 + wide - 1; int L2 = H1 + 1; int H2 = (L2 + wide - 1) <= (len - 1) ? (L2 + wide - 1) : (len - 1); int *crr = (int *)malloc(sizeof(int)*len); assert(crr != NULL); int i = 0; while (L2 <= len - 1) { while (L1 <= H1 && L2 <= H2) { if (arr[L1] < arr[L2]) { crr[i++] = arr[L1++]; } else { crr[i++] = arr[L2++]; } } while (L1 <= H1) { crr[i++] = arr[L1++]; } while (L2 <= H2) { crr[i++] = arr[L2++]; } L1 = H2 + 1; H1 = L1 + wide - 1; L2 = H1 + 1; H2 = (L2 + wide - 1) <= (len - 1) ? (L2 + wide - 1) : (len - 1); } while (L1 <= len - 1) { crr[i++] = arr[L1++]; } for (int i = 0; i < len; i++)//将值赋给arr,释放申请的空间crr { arr[i] = crr[i]; } free(crr);}void MergeSort(int *arr,int len){ if (arr == NULL) return; for (int i = 1; i < len; i = i * 2) { Merge(arr,len,i); }}int main(){ int arr1[] = {11,3,15,10,7,2,44,1,0}; int n1 = sizeof(arr1) / sizeof(sizeof(arr1[0])); //归并排序 空间复杂度n 时间复杂度 2n*logn 稳定 printf("归并排序(递归):\n"); MergeSort(arr1,n1); Show(arr1, n1); return 0;}
运行结果:
归并排序 空间复杂度n 时间复杂度 2n*logn 稳定
归并排序和堆排序、快速排序的比较
若从空间复杂度来考虑:首选堆排序,其次是快速排序,最后是归并排序。
若从稳定性来考虑,应选取归并排序,因为堆排序和快速排序都是不稳定的。
若从平均情况下的排序速度考虑,应该选择快速排序。
0 0
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- IntelliJ下使用Code/Live Template加快编码速度:程序员的工作不是写程序,而是写程序解决问题
- 解决Tkinter中grid/pack布局中的listbox,scrollbar组合横置
- 深圳市注册新公司的流程
- mysql 数学函数
- 二叉树基础-二叉树类模板的实现(数据结构基础 第5周)
- 归并排序
- java基础学习总结——流
- android计算据当前时间的天数和年龄
- C语言之父丹尼斯·里奇:乔布斯脚下的巨人肩膀
- IE8:由于出现错误 80020101 而导致此项操作无法完成...........
- java基础学习总结——线程(二)
- java.lang.IllegalArgumentException: pointerIndex out of range(ViewPager与PhotoView联合使用)
- 冷战
- 面经(人人车)