归并排序总结

归并排序总结

          最近学习《算法导论》,看到第二章中给出的归并排序的伪代码(给出的是合并的那一部分,不包括递归的伪代码),后想将其实现,在实现的过程中,遇到一些问题,比如在划分的两个数组中设置哨兵,算法导论中这样给出的:left[n1]<—∞,当时不知道如何去设置这个哨兵,后来通过查资料,发现只需要定义一个宏常数,比较大的常数赋值给哨兵即可。下面给出算法导论的对于合并部分的伪代码(归并排序主要分三部分,分解(分成左右两个数组)—>(解决)对于每个数组进行排序—>合并):

完整代码如下:

#include<iostream.h>
#define N 100
#define INT_MAX 1e9
void mergeSort(int arr[],int first,int mid,int last)
{
 int n1=mid-first+1;
 int n2=last-mid;
 int left[N],right[N];
    for (int i=0;i<n1;i++)
    {
  left[i]=arr[first+i];
    }
 
 for (int j=0;j<n2;j++)
 {
  right[j]=arr[mid+j+1];
 }
 left[n1]=right[n2]=INT_MAX; 
 i=j=0;
   for (int k=first;k<=last;k++)
   {
    if (left[i]<=right[j])
    {
     arr[k]=left[i];
     i++;
    }
    else
    {
     arr[k]=right[j];
     j++;
    }
   }
}
void sort_merge(int arr[],int first,int last)
{
 int mid=0;
 if (first<last)
 {
  mid=first/2+last/2;
  sort_merge(arr,first,mid);
  sort_merge(arr,mid+1,last);
  mergeSort(arr,first,mid,last);
 }

}
int main(int argc, char* argv[])
{
 int arr[]={6,2,8,22,98,76,54};   
 int first=0;
 int last=sizeof(arr)/sizeof(int);
 sort_merge(arr,first,last);
 cout<<"排序后的数组:";
    for(int j=0;j<last;j++)
 {
    cout<<arr[j]<<"\t";
 }
 cout<<endl;
 return 0;
}

运行结果:

归并排序的时间复杂度为O(nlg(n)),是一种稳定的排序算法!

仅供参考,欢迎指错!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值