归并排序及其应用场景

x33g5p2x  于2021-09-25 转载在 其他  
字(1.5k)|赞(0)|评价(0)|浏览(556)

一、归并排序的概念

二、归并排序递归与非递归实现

归并排序递归实现,分治为每个区间元素都有序,那么就得把区间 分治成为1才能保证区间中每个元素都有序,在归并:

  1. //归并排序
  2. void _MergeSort(int*arr, int left, int right, int* tmp)
  3. {
  4. if (left >= right)
  5. {
  6. return;
  7. }
  8. int mid = left + (right - left) / 2;
  9. _MergeSort(arr, left, mid, tmp);
  10. _MergeSort(arr, mid + 1, right, tmp);
  11. int begin1 = left;
  12. int end1 = mid;
  13. int begin2 = mid + 1;
  14. int end2 = right;
  15. int i = left;
  16. while (begin1 <= end1&&begin2 <= end2)
  17. {
  18. if (arr[begin1] < arr[begin2])
  19. {
  20. tmp[i++] = arr[begin1++];
  21. }
  22. else if (arr[begin1]>arr[begin2])
  23. {
  24. tmp[i++] = arr[begin2++];
  25. }
  26. }
  27. while (begin1 <= end1)
  28. {
  29. tmp[i++] = arr[begin1++];
  30. }
  31. while (begin2 <= end2)
  32. {
  33. tmp[i++] = arr[begin2++];
  34. }
  35. for (int j = left; j <= right; j++)
  36. {
  37. arr[j] = tmp[j];
  38. }
  39. }
  40. void MergeSort(int* arr, int sz)
  41. {
  42. int* tmp = new int[sz];
  43. _MergeSort(arr, 0, sz - 1, tmp);
  44. delete[] tmp;
  45. }

归并排序非递归实现 ,借助gap值来归并:

注意归并时候发生的三种情况:

  1. void _MergeSortNonR(int* arr, int begin1, int end1, int begin2, int end2, int* tmp)
  2. {
  3. int i = begin1;
  4. int j = begin1;
  5. while (begin1 <= end1&&begin2 <= end2)
  6. {
  7. if (arr[begin1] < arr[begin2])
  8. {
  9. tmp[i++] = arr[begin1++];
  10. }
  11. else
  12. {
  13. tmp[i++] = arr[begin2++];
  14. }
  15. }
  16. while (begin1 <= end1)
  17. {
  18. tmp[i++] = arr[begin1++];
  19. }
  20. while (begin2 <= end2)
  21. {
  22. tmp[i++] = arr[begin2++];
  23. }
  24. for (; j <= end2; j++)//begin1加加j不受到影响
  25. {
  26. arr[j] = tmp[j];
  27. }
  28. }
  29. void MergeSortNonR(int* arr, int sz)
  30. {
  31. int* tmp = new int[sz];
  32. int gap = 1;
  33. while (gap < sz)
  34. {
  35. for (int i = 0; i < sz; i += 2 * gap)
  36. {
  37. int begin1 = i;
  38. int end1 = i + gap - 1;
  39. int begin2 = i + gap;
  40. int end2 = i + 2 * gap - 1;
  41. //如果第二个小区间不存在了
  42. if (begin2 >= sz)
  43. {
  44. break;
  45. }
  46. //如果第二个小区间存在,但是第二个小区间不够gap个,结束位置就越界了,需要修正一下
  47. if (end2 >= sz)
  48. {
  49. end2 = sz - 1;
  50. }
  51. _MergeSortNonR(arr, begin1, end1, begin2, end2, tmp);
  52. }
  53. }
  54. }

三、归并排序应用场景

四、归并排序总结

相关文章