归并排序
原理:运用双指针来求解问题,时间复杂度nlog2(n)
原理步骤:
1.先找到数组的中间值mid=(l+r)>>2
2递归,把递归的各段排好顺序
3.归并,把所得到的归并到一起
例如:(归并思想)1 3 5 7 9这个指针先指向1
2 4 5 8 10 这个指针先指向2
指定一个temp[]数组,1小于2,1加入temp,第一段指针指向3,第二段不变指针指向2,2小于3,2加入temp,第一段不变,第二段指向4,4比3大,3加入temp,第一段指针移到5,4小于5,4加入temp,第二段移到5,5和5,默认把上面那个5加入temp,以此类推最后如果两个还剩下数的话直接加进去就好了。
代码
#include<stdio.h>
#include<iostream>
using namespace std;
const int N=1e6+10;
int q[N],n,tmp[N];
void guibing_sork(int q[],int l,int r)
{
if(l>=r)return ;//如果只有一个的话就直接返回
int mid=l+r>>1;//第一步找一个中间值
int k=0,j=mid+1,i=l;
guibing_sork(q,l,mid),guibing_sork(q,mid+1,r);//递归先排好各段的序列
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++];//把剩下的第一段加入临时数组tmp
while(j<=r)tmp[k++]=q[j++];//把剩下的第一段加入临时数组tmp
for(i=l,j=0;i<=r;i++,j++)q[i]=tmp[j];//原来的重新加q数组中
}
int main()
{
cout<<"请你输入要输入数的个数:";
scanf("%d",&n);
for(int i=0;i<n;i++)scanf("%d",&q[i]) ;
guibing_sork(q,0,n-1);
for(int i=0;i<n;i++)printf("%d ",q[i]);
return 0;
}
结果.
总结。
归并排序在运用时要用双指针算法,且可按照:1找中间值。2递归。3归并来完成其归并算法。