算法导论学习之归并排序

客官°小女子只卖身不卖艺 2022-08-26 08:14 203阅读 0赞

惭愧,又好久没看《算法导论》了。上次看《算法导论》的归并排序算法,后来自己写了段代码,实现了算法,不过有问题,一直也没找出问题来。今天趁着礼拜天有时间,调试一下代码。时间不早了,明天还得上班,有时间我会给代码加段注释,以及我在写这段代码的时候,遇到的问题与大家分享,防止大家也犯类似的错误。

  1. // mergeSort.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include "iostream"
  5. using namespace std;
  6. void printArray(int a[], int beg, int end) {
  7. for (int i = beg; i < end+1; i++) {
  8. cout << a[i] << " ";
  9. }
  10. cout << endl;
  11. }
  12. void merge(int a[], int left, int middle, int right) {
  13. int leftLen = middle - left + 1;
  14. int rightLen = right - middle;
  15. int* tempLeft = new int[leftLen+1];
  16. int* tempRight = new int[rightLen+1];
  17. for (int i = 0; i < leftLen; i++) {
  18. tempLeft[i] = a[left + i];
  19. }
  20. for (int j = 0; j < rightLen; j++) {
  21. tempRight[j] = a[j+left+leftLen];
  22. }
  23. tempLeft[leftLen] = 100000;
  24. tempRight[rightLen] = 100000;
  25. int i = 0;
  26. int j = 0;
  27. for (int k = left; k < right+1; k++) {
  28. if (tempLeft[i] < tempRight[j]) {
  29. a[k] = tempLeft[i];
  30. i++;
  31. } else {
  32. a[k] = tempRight[j];
  33. j++;
  34. }
  35. }
  36. }
  37. void mergeSort(int a[], int left, int right) {
  38. int middle = (left+right)/2;
  39. if (left < right) {
  40. mergeSort(a, left, middle);
  41. mergeSort(a, middle+1, right);
  42. cout << "before merge:" << endl;
  43. printArray(a, left, right);
  44. merge(a, left, middle, right);
  45. cout << "merged:" << endl;
  46. printArray(a, left, right);
  47. }
  48. }
  49. void test1() {
  50. int a[10] = {7, 6, 5, 9, 0, 3, 1, 2, 8, 4};
  51. mergeSort(a, 0, 9);
  52. cout << "final sort:" << endl;
  53. for (int i = 0; i < 10; i++) {
  54. cout << a[i] << " ";
  55. }
  56. }
  57. int _tmain(int argc, _TCHAR* argv[])
  58. {
  59. test1();
  60. int b;
  61. cin >> b;
  62. return 0;
  63. }

20140330232514125

发表评论

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

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

相关阅读

    相关 算法导论学习插入排序

    《算法导论》买了好久了,基本上没怎么看,最近思想上有了转变,觉得学习才是王道。准备重新拾起来学习,下面我就《算法导论》中的排序算法中的 插入排序做了个c++的简单实现,附加解

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

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

    相关 算法导论归并排序

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