归并排序

本文深入探讨了归并排序的算法思想、实现细节及优化策略。包括如何通过合并序列进行排序,具体实现代码,以及考虑内存管理和提高效率的优化措施。文章还介绍了归并排序在大规模数据排序中的应用特点,以及与STL中稳定排序实现的对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算法思想:

分治法,将一个序列分为两部分,分别排序,然后合并已排序序列。

算法实现:

 1 void merge(int A[],int p,int q,int r )
 2 {
 3     int * AA = new int[r-p+1];
 4     int i = p;
 5     int j = q;
 6     int k = 0;
 7 
 8     while( i < q && j <= r )
 9     {
10         if( A[i] <= A[j] ) AA[k++] = A[i++];
11         else AA[k++] = A[j++];
12     }
13     while( i < q )
14     {
15         AA[k++] = A[i++];
16     }
17     while( j <= r )
18     {
19         AA[k++] = A[j++];
20     }
21 
22     memcpy(A,AA,(r-p+1)*sizeof(int));
23     delete []AA;
24 }
25 
26 void merge_sort( int A[], int n )
27 {
28     if( n < 2 ) return ;
29     int mid = n/2;
30     merge_sort( A, mid);
31     merge_sort( A+mid, n-mid);
32     merge( A, 0, mid, n-1 );
33 }

 

考虑优化点:

  1. 合并时每次申请、释放内存会严重影响运行效率,可以考虑在外部传入空间用于合并操作
  2. 在子序列数量较小时,可以使用插入排序来优化提升效率
  3. 合并后将序列复制到原序列中,该操作会增加nlgn的数据复制,可以参考stl中stable_sort的实现方式,避免或减少数据复制

算法复杂度:

平均:O(nlgn)

最差:O(nlgn)

最优:O(nlgn)

空间复杂度:O(n)

 

使用场景:

归并排序由于有比较优的时间复杂度,并且具有排序稳定性(相同key值元素不改变位置),因此一般用在要求稳定性的大规模数据排序中。

 

STL实现:

stl的stable_sort内部采用了归并算法实现,在有足够归并空间时,其复杂度为O(nlgn),但当空间不足时,其复杂度为O(n lgn lgn )

转载于:https://www.cnblogs.com/stormli/p/merge_sort.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值