归并排序_C

十大经典排序

归并排序

归并排序是一种分治算法,它将一个大问题分成两个或多个小问题,解决小问题,然后将解决后的结果合并起来解决大问题。这个算法的基本思想是将待排序的序列分成若干个子序列,每个子序列都是有序的,然后再将有序子序列合并成一个有序的序列。

稳定性平均时间复杂度空间复杂度
不稳定O(nlogn)O(n)

gif动图

在这里插入图片描述

#include<stdio.h>
void merge(int arr[],int start1,int end1,int start2,int end2,int reg[])
{
  int i=start1;
  int j=start2;
  int k=start1;
  while(i<=end1&&j<=end2)
  {
    if(arr[i]<=arr[j])
    reg[k++]=arr[i++];
    else
    reg[k++]=arr[j++];
  }
  while(i<=end1)
  reg[k++]=arr[i++];
  while(j<=end2)
  reg[k++]=arr[j++];
  for(int i=start1;i<=end2;++i)
  arr[i]=reg[i];
}
void merge_rerisive(int arr[],int begin,int end,int reg[] )
{
  if(begin>=end)
  return;
  int minute=begin+end>>1;
  int start1=begin;
  int start2=minute+1;
  int end1=minute;
  int end2=end;
  merge_rerisive(arr,begin,minute,reg);
  merge_rerisive(arr,minute+1,end,reg);
  merge(arr,begin,minute,minute+1,end2,reg);
}
void merge_sort(int arr[],int len)
{
  int reg[len];
  merge_rerisive(arr,0,len-1,reg);
}
void merge_print(int arr[],int len)
{
 for(int i=0;i<len;++i)
 printf("%d ",arr[i]);
}
int main()
{

  int arr[] = { 3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50 ,48 };
  int len=15;
  merge_sort(arr,len);
  merge_print(arr,len);
    return 0;

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值