算法导论:c++归并排序

偏执的太偏执、 2022-06-04 02:53 262阅读 0赞

基本思想就是把数组一直分成两半,然后对这两半进行排序归并。
先分成左右两半,然后合并时比较左右两半一直选最小的替代原数组。这种排序是非原址的,需要额外的空间。
伪代码非常简单,采用分治的思想:
这里写图片描述
合并的伪代码:
这里写图片描述
一趟合并的示意图:
这里写图片描述

代码实现

  1. /*归并排序合并部分*/
  2. void merge(int array[], int p, int q, int r) {
  3. int n1 = q - p + 1; //左半边数组长
  4. int n2 = r - q;
  5. int i=0,j = 0;
  6. vector<int> left(n1+1);
  7. vector<int> right(n2+1);
  8. for (i = 0; i < n1; i++) //左半边数组
  9. {
  10. left[i] = array[p+i];
  11. }
  12. left[n1] = INT_MAX; //最后一个元素置为最大
  13. for (j=0; j < n2; j++) //右半边数组
  14. {
  15. right[j] = array[q + j + 1];
  16. }
  17. right[n2] = INT_MAX; //最后一个元素置为最大
  18. i = 0;
  19. j = 0;
  20. for (int k = p; k <=r; k++) //注意此处边界条件,k要等于r
  21. {
  22. if (left[i] < right[j]) //每次取最小
  23. {
  24. array[k] = left[i];
  25. i++;
  26. }
  27. else
  28. {
  29. array[k] = right[j];
  30. j++;
  31. }
  32. }
  33. }
  34. /*归并排序*/
  35. void merge_sort(int array[], int p, int r) {
  36. if (p < r) {
  37. int q = (p + r) / 2;
  38. merge_sort(array, p, q);
  39. merge_sort(array, q + 1, r);
  40. merge(array, p, q, r);
  41. }
  42. }

测试

  1. int main()
  2. {
  3. const int len = 8;
  4. int array[len] = { 2,8,7,1,3,5,6,4};
  5. merge_sort(array, 0, 7);
  6. for (int i = 0; i < len; i++)
  7. {
  8. cout << array[i] << " ";
  9. }
  10. }

输出:1 2 3 4 5 6 7 8

发表评论

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

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

相关阅读

    相关 算法导论c++归并排序

    基本思想就是把数组一直分成两半,然后对这两半进行排序归并。 先分成左右两半,然后合并时比较左右两半一直选最小的替代原数组。这种排序是非原址的,需要额外的空间。 伪代码非

    相关 算法导论归并排序

    归并排序的思想就是分治法; 分治法:为了解决一个给定的问题,算法一次或多次递归地调用其自身以解决紧密相关的若干子问题。 分治模式在每层递归时都有三个步骤: 一,分解原问题