归并排序
/<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 = m; // 返回data,此时已完成排序 free(m); // 最后释放m return 0; } // 排序函数 int mgsort(void *data, int size, int esize, int i, int k, int (*compare)(const void *key1, const void *key2)) { int j; if (i < k) { j = (k + i - 1) / 2; // 让j取中间值 if (mgsort(data, size, esize, i, j, compare) < 0)// 不断的分割左边,递归后合并 { return -1; } if (mgsort(data, size, esize, j+1, k, compare))// 分割右边 { return -1; } if (merge(data, size, esize, i, k, j, compare) < 0) { return -1; } } return 0; }
原文:http://blog.csdn.net/liyakun1990/article/details/39463141