首页 > 代码库 > 算法精解(三)——归并排序
算法精解(三)——归并排序
归并排序
O(NlogN),所以归并排序最坏情况能够达到快速排序的平均水准
需要额外的存储空间O(n)
1、对数据不断的分割,直到剩下一个一个的
2、合并数据,在合并的时候,其实是两个有序的数组,因此
这个过程是两个有序数组进行合并排序
O(NlogN),所以归并排序最坏情况能够达到快速排序的平均水准
需要额外的存储空间O(n)
1、对数据不断的分割,直到剩下一个一个的
2、合并数据,在合并的时候,其实是两个有序的数组,因此
这个过程是两个有序数组进行合并排序
/<span id="_xhe_cursor"></span>/ 归并排序 // O(NlogN),所以归并排序最坏情况能够达到快速排序的平均水准 // 需要额外的存储空间O(n) // 1、对数据不断的分割,直到剩下一个一个的 // 2、合并数据,在合并的时候,其实是两个有序的数组,因此 // 这个过程是两个有序数组进行合并排序 #include "sort.h" // merge函数实现了合并的过程 // i为数组最小索引,j为中间值,k为最大索引值 int merge(void *data, int size, int esize, int i, int k, int j, int (*compare)(const void *key1, const void *key2)) { int ipos, jpos, mpos; // i, j, m的游标 int *a = (int *)data; int *m; // 申请的m的额外空间 if ((m = (int *)malloc(sizeof(int) * size)) == NULL) { return -1; } memcpy(m, 0, sizeof(int) * size); ipos = i; jpos = j; // j为中间值 mpos = 0; while (ipos <= j || jpos <= k) { while (ipos <= j && jpos >= k) // 当就剩下i的索引没有到中间 { memcpy(&m[mpos], &a[ipos], sizeof(int)); ipos++; mpos++; } while (ipos >= j && jpos <= k) // 当就剩下j的索引没有到中间 { memcpy(&m[mpos], &a[jpos], sizeof(int)); jpos++; mpos++; } if (compare(&a[ipos], &a[jpos]) <= 0 ) // 小的数先插入到m临时序列 { memcpy(&m[mpos], &a[ipos], sizeof(int)); ipos++; mpos++; } else { memcpy(&m[mpos], &a[jpos], sizeof(int)); jpos++; mpos++; } } data = http://www.mamicode.com/m; // 返回data,此时已完成排序>算法精解(三)——归并排序
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。