各种排序总结(六)归并排序

复制代码
 1 /****************
 2 思路:假设待排序有n个记录,将这n个记录看成n个有序的子序列,每个子序列长度为1,
 3 然后两两归并。
 4 如何将将二个有序数列合并:这个非常简单,只要从比较二个数列的第一个数,
 5 谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,
 6 那直接将另一个数列的数据依次取出即可。
 7 ****************/
 8 #include <iostream>
 9 
10 using namespace std;
11 
12 //将有二个有序数列arr[first...mid]和arr[mid...last]合并。主要是merge这个函数
13 void Merge(int* arr, int first, int mid, int last, int* temp)
14 {
15     int f1 = first;
16     int m = mid;
17     int f2 = mid+1;
18     int l = last;
19     int i = 0;
20     while((f1 <= m)&&(f2 <= l))
21     {
22         if(arr[f1] < arr[f2])
23             temp[i++] = arr[f1++];
24         else
25             temp[i++] = arr[f2++];
26     }
27     while(f1 <= m)
28         temp[i++] = arr[f1++];
29     while(f2 <= l)
30         temp[i++] = arr[f2++];
31     for(int j=0; j<i; j++)
32         arr[first + j] = temp[j];
33 }
34 
35 
36 void MergeSort(int* arr, int first, int last, int* temp)
37 {
38     int mid;
39     if(first < last)  //if first >= last, return
40     {
41         mid = (first + last) /2;
42         MergeSort(arr, first, mid, temp);
43         MergeSort(arr, mid+1, last, temp);
44         Merge(arr,first, mid, last, temp);
45     }
46 }
47 
48 
49 int main()
50 {
51     int * arr;
52     int * temp;
53     int n;
54     cout<<"Input the arr length:"<<endl;
55     cin>>n;
56     arr = new int[n];
57     temp = new int[n];
58     cout<<"Input the arr elements:"<<endl;
59     for(int i=0;i<n;i++)
60     {
61         cin>>arr[i];
62     }
63     MergeSort(arr,0,n-1,temp);
64     cout<<"The outcome:"<<endl;
65     for(int i=0;i<n;i++)
66         cout<<arr[i]<<endl;
67     return 0;
68 }
69 /************************
70 稳定的。
71 时间复杂度:归并排序不依赖与原始数组的输入情况,每次划分时两个子序列长度都是基本一样的,
72             因此最大、最小和平均时间均为O(nlogn)。
73 空间复杂度:用到一个临时数组,因此空间代价为O(n)。
74 总结:
75 1.排序时间不依赖于原始数组;
76 2.时间为O(nlogn),因此适用于数组n较大的情况;
77 3.空间代价为O(n)。
78 *************************/
复制代码

 

posted on   CnZyy  阅读(255)  评论(0编辑  收藏  举报

编辑推荐:
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
阅读排行:
· Sdcb Chats 技术博客:数据库 ID 选型的曲折之路 - 从 Guid 到自增 ID,再到
· .NET Core GC压缩(compact_phase)底层原理浅谈
· Winform-耗时操作导致界面渲染滞后
· Phi小模型开发教程:C#使用本地模型Phi视觉模型分析图像,实现图片分类、搜索等功能
· 深度学习基础理论————CV中常用Backbone(Resnet/Unet/Vit系列/多模态系列等
< 2025年1月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8

导航

统计

点击右上角即可分享
微信分享提示