merge_sort
来源:互联网 发布:淘宝网司法房产拍卖 编辑:程序博客网 时间:2024/05/22 05:11
上次一个题让写一种稳定的排序算法,就是归并排序咯,然而不会,谨以此记住
归并排序:
时间复杂度 n*log(2) n , 状态 稳定 辅助空间 O(n)
典型的一种二分策略的排序,整个过程分为两步
1. 二分,把待排序数组分成两部分,再二分,直到只剩一个元素为止;
2.合并,每次把两个数组按照从小到大的顺序合并,每一次合并的过程就会有一部分元素变成有序的,
3.分治策略很重要
一个不算精简的代码:
void merge(int* src, int* des, int low,int mid, int high) //合并{int i=low;int j=mid+1;int k=low;while((i<=mid)&&(j<=high)){if(src[i]<src[j]){des[k++] = src[i++];}else{des[k++] = src[j++];}}while(i<=mid){des[k++] = src[i++];}while(j<=high){des[k++] = src[j++];}}void devide(int* src, int* des, int low, int high, int max) //二分{if(low == high) //只剩一个元素,递归划分结束,开始合并{des[low] = src[low];}else{//递归的进行两路划分int mid = (low + high) / 2;int* tmp = (int *)malloc(sizeof(int)* max);if(tmp != NULL){devide(src, tmp, low, mid, max);devide(src, tmp, mid+1, high, max);merge(tmp, des, low, mid, high);}free(tmp);}} void merge_sort(int* src, int length){devide(src, src, 0, length-1, length);}
顺便改成模板函数
template <typename T>void merge(T* src, T * des, int low, int mid, int high) //归并{int i = low;int j = mid + 1;int k = low;while ((i <= mid) && (j <= high)) //将小的放到目的数组中{if (src[i] < src[j]) //那个临时数组{des[k++] = src[i++];}else{des[k++] = src[j++];}}while (i <= mid) //若还剩几个尾部元素{des[k++] = src[i++];}while (j <= high) //若还剩几个尾部元素{des[k++] = src[j++];}}//每次分为两路 当只剩下一个元素时,就不需要在划分template <typename T>void devide(T *src, T* des, int low, int high, int max) //划分{if (low == high) //只剩一个元素时,直接赋值给des{des[low] = src[low];}else{int mid = (low + high) / 2;T* tmp = (T*)malloc(sizeof(T)*max);//递归进行两路,两路的划分 //当剩下一个元素的时,递归划分结束,然后开始merge归并操作if (tmp != NULL){devide(src, tmp, low, mid, max);devide(src, tmp, mid + 1, high, max);merge(tmp, des, low, mid, high); //调用归并函数进行归并}free(tmp);}}template <typename T>void mergesort(T* src, int len){devide(src, src, 0, len - 1, len);}
也可以改成对指针进行存储,然后交换指针,,,,未完
0 0
- merge_sort
- merge_sort
- merge_sort
- merge_sort
- Merge_sort
- 归并排序Merge_Sort
- Merge_sort的优化...
- 归并排序MERGE_SORT
- scala merge_sort排序
- 归并排序(MERGE_SORT)
- 再写merge_sort
- 归并排序(Merge_Sort)
- 我的C算法库【3】:MERGE_SORT
- 归并排序/合并排序(merge_sort)详解
- Algorithmic Implementation series(3) Implementation of Merge_Sort
- 排序算法详解【归并排序-Merge_Sort】
- 2路归并排序(MERGE_SORT)
- merge_sort相比算法导论简易版本实现
- 【LeetCode13】【Roman to Integer】
- 聊聊这个与代码优化有关的选择题 (某公司实习生招聘笔试试题)
- Android调用相机拍照并添加水印
- 综合整理日志打印工具
- 菜单之抽屉菜单(NavigationDrawer)
- merge_sort
- 蓝桥杯--第七届决赛:打靶
- MySQL外键设置中的的 Cascade、NO ACTION、Restrict、SET NULL
- JIRA中的数据存储-----active object
- BCGControlBar工具栏编辑器教程:Visual Designer(上)
- 4.27
- spring使用通用mapper
- 阿里基础平台研发工程师笔试
- JVM调优总结(六)-分代垃圾回收详述2