归并排序merge_sort

这篇博客探讨了算法的稳定性,以快速排序和归并排序为例。文章指出,稳定性不是指时间效率,而是元素相对位置的保持。归并排序因其合并过程确保了稳定性,而快速排序则不具备这一特性。为了使快排变得稳定,提出了一个设想:确保每个元素都不相同。文中还详细介绍了归并排序的步骤,包括分界点确定、递归排序和合并操作,并给出了一段C++实现的归并排序代码示例。
摘要由CSDN通过智能技术生成

一个算法稳不稳定不是指时间效率的稳定,而是相对位置不发生变化就是稳定的。(快排不稳定,而归并稳定)思考:如何让快排变得稳定(把快排里面的每一个元素变的都不一样)


归并算法的思想:(双指针算法)

时间复杂度:O(nlog2n)

1.确定分界点

2.递归排序分界点的left跟right

3.合并(一个是重点)


样例分析:有一组数据为1 3 4 5 6 2 9 8 (一共8个数),分成俩组排序后为1 3 4 5 / 2 6 8 9,接着用两个指针分别指向1 2,合二位一。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>

using namespace std;

const int N=100010;
int q[N],tmp[N];

void merge_sort(int q[],int l,int r)
{
    if(l>=r) return ;
    int mid=(l+r)/2;    //分成子问题
    merge_sort(q,l,mid);
    merge_sort(q,mid+1,r);
    

```
//合并子问题
int k=0,i=l,j=mid+1;
while(i<=mid&&j<=r)
{
    if(q[i]<=q[j]) tmp[k++]=q[i++];
    else tmp[k++]=q[j++];
}
while(i<=mid) tmp[k++]=q[i++];
while(j<=r) tmp[k++]=q[j++];

for(k=0,i=l;i<=r;k++,i++) q[i]=tmp[k];        
```

}

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)    scanf("%d",&q[i]);
    merge_sort(q,0,n-1);
    for(int i=0;i<n;i++)    printf("%d ",q[i]);
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值