十大经典排序
归并排序
归并排序是一种分治算法,它将一个大问题分成两个或多个小问题,解决小问题,然后将解决后的结果合并起来解决大问题。这个算法的基本思想是将待排序的序列分成若干个子序列,每个子序列都是有序的,然后再将有序子序列合并成一个有序的序列。
稳定性 | 平均时间复杂度 | 空间复杂度 |
---|---|---|
不稳定 | 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;
}