【算法导论笔记】插入排序 && 归并排序

小灰灰 2022-05-08 10:06 295阅读 0赞

插入排序 时间复杂度 O(n^2)

  1. #include "pch.h"
  2. #include <iostream>
  3. void insectionSort();
  4. int origin[] = { 12, 15, 3, 2, 31, 34, 18, 9, 99, 121, 56 };
  5. int main()
  6. {
  7. insectionSort();
  8. for (int i = 0; i < sizeof(origin) / sizeof(origin[0]); i++)
  9. {
  10. std::cout << origin[i] << std::endl;
  11. }
  12. }
  13. void insectionSort()
  14. {
  15. for (int i = 1; i < sizeof(origin) / sizeof(origin[0]); i++)
  16. {
  17. // 标记第 i 个做插入排序的元素,0 - i-1 已经是有序序列
  18. int temp = origin[i];
  19. // 从 i-1 开始和前面排序序列比较,看在哪里插入
  20. int j = i - 1;
  21. for (; j >= 0 && origin[j] > temp; j--)
  22. {
  23. origin[j + 1] = origin[j];
  24. }
  25. // 最终的 j 标识插入的前一个位置
  26. origin[j + 1] = temp;
  27. }
  28. }

归并排序 时间复杂度 O(nlogn)

  1. #include "pch.h"
  2. #include <iostream>
  3. void mergeSort(int * A, int number);
  4. void merge(int * A, int * L, int lIndex, int * R, int rIndex);
  5. int main()
  6. {
  7. int sequence[] = { 12, 15, 3, 2, 31, 34, 18, 9, 99, 121, 56 };
  8. int sizeOfElements = sizeof(sequence) / sizeof(sequence[0]);
  9. mergeSort(sequence, sizeOfElements);
  10. for (int i = 0; i < sizeOfElements; i++)
  11. {
  12. std::cout << sequence[i] << std::endl;
  13. }
  14. }
  15. /* 归并排序主代码 */
  16. void mergeSort(int * A, int size)
  17. {
  18. if (size < 2) return;
  19. int mid = size / 2;
  20. int *L, *R;
  21. L = new int[mid];
  22. R = new int[size - mid];
  23. for (int i = 0; i < mid; i++) L[i] = A[i];
  24. for (int i = mid; i < size; i++) R[i - mid] = A[i];
  25. mergeSort(L, mid);
  26. mergeSort(R, size - mid);
  27. merge(A, L, mid, R, size - mid);
  28. delete[] L;
  29. delete[] R;
  30. }
  31. /* 合并两个已排序的数组,最终返回给 A */
  32. void merge(int * A, int * L, int lSize, int * R, int rSize)
  33. {
  34. int lIndex = 0, rIndex = 0;
  35. for (int i = 0; i < lSize + rSize; i++)
  36. {
  37. if (lIndex >= lSize)
  38. {
  39. A[i] = R[rIndex++];
  40. continue;
  41. }
  42. if (rIndex >= rSize)
  43. {
  44. A[i] = L[lIndex++];
  45. continue;
  46. }
  47. if (L[lIndex] < R[rIndex])
  48. {
  49. A[i] = L[lIndex++];
  50. }
  51. else if (L[lIndex] == R[rIndex])
  52. {
  53. A[i] = L[lIndex++];
  54. }
  55. else if (L[lIndex] > R[rIndex])
  56. {
  57. A[i] = R[rIndex++];
  58. }
  59. }
  60. }

发表评论

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

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

相关阅读

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

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

    相关 算法导论归并排序

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