基础算法-归并排序

一时失言乱红尘 2022-07-26 04:08 190阅读 0赞

原理


归并排序是稳定的排序算法,其时间复杂度为O(lgN),空间复杂度为O(N)

算法步骤


使用分治法进行归并排序。
纸面上二路归并算法:
一、有序列{a1, a2, a3,…an},二分法得到两个序列{a1, a2,… ak}和{ak+1,… an},其中k=(1+n)/2;
二、同理,这两个子序列分别进行二分得到新的4个序列,直到划分成{a1},{a2}… {an}个序列为止。
三、{a1},{a2}… {an},可看做有序序列,然后进行二路有序合并即{a1, a2}, {a3, a4}, … {an-1, an}。这些序列中a1

实现


  1. // 一般递归版本、二路归并
  2. // 合并函数
  3. // 要合并的数组1:src[start]~src[mid]
  4. // 要合并的数组2:src[mid+1]~src[end]
  5. // 临时存放数组 dst[start] ~ dst[end]
  6. void merge(int src[], int dst[], int start, int mid, int end) {
  7. int i = start;
  8. int j = mid+1;
  9. int k = start; // 注意:dst数组索引起始位置为start与src相同
  10. /*
  11. while (i < mid+1 && j < end+1) {
  12. if (src[i] < src[j])
  13. dst[k++] = src[i++];
  14. else
  15. dst[k++] = src[j++];
  16. }
  17. while (i < mid+1) {
  18. dst[k++] = src[i++];
  19. }
  20. while (j < end+1) {
  21. dst[k++] = src[j++];
  22. }
  23. */
  24. while (k <= end) {
  25. if (j > end || (i <= mid && src[i] < src[j])) {
  26. dst[k++] = src[i++];
  27. } else {
  28. dst[k++] = src[j++];
  29. }
  30. }
  31. // 重新写回原数组
  32. for (i = start; i < end+1; i++) {
  33. src[i] = dst[i];
  34. }
  35. }
  36. // 更好的merge版本
  37. void merge(int src[], int dst[], int start, int mid, int end) {
  38. int i = start;
  39. int j = mid+1;
  40. for (int k = start; k <= end; k++) {
  41. if (i > mid) dst[k] = src[j++];
  42. else if (j > end) dst[k] = src[i++];
  43. else if (src[i] < src[j]) dst[k] = src[i];
  44. else dst[k] = src[j];
  45. }
  46. // 重新写回原数组
  47. for (i = start; i < end+1; i++) {
  48. src[i] = dst[i];
  49. }
  50. }
  51. // b[] 数组大小与a[]一样,临时存放合并后的元素
  52. void mergeSort(int a[], int b[], int start, int end) {
  53. if (start < end) { // 不考虑一个元素的情况,直接从两个元素的归并开始
  54. int mid = (start + end)/2;
  55. mergeSort(a, b, start, mid);
  56. mergeSort(a, b, mid+1, end);
  57. // 若两部分已经有序且右半部最小值大于等于左半部最大值,则直接返回
  58. if (a[mid+1] >= a[mid]) return;
  59. merge(a, b, start, mid, end);
  60. }
  61. }

发表评论

表情:
评论列表 (有 0 条评论,190人围观)

还没有评论,来说两句吧...

相关阅读

    相关 排序算法——归并排序

    引言 归并排序可以使用递归或迭代的方式来实现,时间复杂度是都是 O(N \ logN)。 归并排序的核心是将待排序数组分组,可以整体二分,也可以设置步长迭代切分。归并排

    相关 排序算法-归并排序

    归并排序也是一个比较快速的排序算法,其思想是运用分治的思想,先对要排序的数进行分,每次从中间分成两部分,然后知道分成最小,然后在把他们合起来,边合起来边排序,最后有序,每次分的

    相关 排序算法归并排序

    一、前言     归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用 分治法(Divide and Conquer) 的一个非常典型的应用。 --------