简单的归并排序-

归并排序:是利用归并的思想实现的排序方法,该算法采用经典的分治策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。
下面的图片很清晰的反映了"从下往上"和"从上往下"的归并排序的区别。
在这里插入图片描述
从上面的图中可以看出,归并的核心思想是:分治。当我们要排序这样一个数组的时候,首先将这个数组分成一半。然后再继续二分,直到每一个为一部分为止,然后做进行归并,归并到上一个层级后继续归并,归并到更高的层级,直到最后归并完成。
在这个过程中我们可以开辟一个临时数组的来辅助我们的归并。它虽然比选择排序,插入排序使用了更多的存储空间,也就是说它需要O(n)的额外空间来完成排序但无论内存也好还是硬盘也好可以存储的数据越来越多,所以设计一个算法,时间复杂度是优先考虑的。
当我们比较完后,剩余部分比之前的值都大或都小,所以只需将剩余部分直接移上去就好了,我们用while进行判断。
我们用代码实现如下:
void fun(int a,int mid,int b)
{
int i = a,j = mid+1,k = a;

while(i <= mid&&j <= b)
{
    if(num[i] <= num[j])
      c[k++] = num[i++];
    else
    {
       c[k++] = num[j++];
   
    }
}
while(i <= mid) c[k++] = num[i++];
while(j <= b)c[k++] = num[j++];
for(i = a;i <= b;i++)
   num[i] = c[i];

}

void My(int a,int b)
{
if(a < b)
{
int mid = (a+b)/2;
My(a,mid);
My(mid+1,b);
fun(a,mid,b);
}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值