排序算法—归并排序

x33g5p2x  于2021-09-19 转载在 其他  
字(0.9k)|赞(0)|评价(0)|浏览(516)

算法稳定性:稳定

复杂度分析:

  • 空间复杂度:O(n)
  • *时间复杂度:O(n/logn)

实现代码:

  1. #include<iostream>
  2. using namespace std;
  3. //归并排序
  4. int nums[155];
  5. int tmp[155]; //辅助数组,暂时存放要归并的序列
  6. //归并
  7. void Merge(int* nums, int left, int mid, int right) {
  8. for (int i = left; i <= right;i++) {
  9. tmp[i] = nums[i]; //将要归并的序列暂时存放在 辅助数组tmp中
  10. }
  11. //将两个子数组合并成一个数组
  12. int i = left, j = mid + 1, k = left;
  13. for (k = left;i <= mid && j <= right;k++) {
  14. if (tmp[i] <= tmp[j]) {
  15. nums[k] = tmp[i++];
  16. }
  17. else {
  18. nums[k] = tmp[j++];
  19. }
  20. }
  21. while (i <= mid) nums[k++] = tmp[i++];
  22. while (j <= right) nums[k++] = tmp[j++];
  23. }
  24. //归并排序
  25. void MergeSort(int* nums, int left, int right) {
  26. if (left >= right) //递归终止条件,只剩下一个元素时停止划分
  27. return;
  28. int mid = (left + right) / 2; //划分边界
  29. MergeSort(nums, left, mid); //对左边部分进行归并排序
  30. MergeSort(nums, mid + 1, right); //对右半部分进行归并排序
  31. Merge(nums, left, mid, right); //归并
  32. }
  33. int main() {
  34. int n;
  35. cin >> n;
  36. for (int i = 0;i < n;i++) {
  37. cin >> nums[i];
  38. }
  39. MergeSort(nums, 0, n - 1); //归并排序
  40. cout << "排序后的序列为:";
  41. for (int i = 0;i < n;i++) {
  42. cout << nums[i] << " ";
  43. }
  44. return 0;
  45. }

运行结果:

在这里插入图片描述

相关文章