概念:二分法插入排序是在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们中间的那个元素比,如果小,则对前半再进行折半,否则对后半进行折半,直到left>right,然后再把第i个元素前1位与目标位置之间的所有元素后移,再把第i个元素放在目标位置上
就如图:
代码就如下:
#include<bits/stdc++.h>
using namespace std;
int s1[100001],s2[100001],n;
void merge(int L,int Mid,int R){
int i=L,j=Mid+1,k=L;
while(i<=Mid&&j<=R){
if(s1[i]<s1[j]) s2[k++]=s1[i++];
else s2[k++]=s1[j++];
}
while(i<=Mid) s2[k++]=s1[i++];
while(j<=R) s2[k++]=s1[j++];
for(i=L;i<=R;i++) s1[i]=s2[i];
}
void mergrSort(int L,int R){
if(L<R){
int Mid=(L+R)/2;
mergeSort(L,Mid);
mergeSort(Mid+1,R);
merge(L,Mid,R);
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>s1[i];
mergeSort(1,n);
for(int i=1;i<=n;i++) cout<<s1[i]<<" ";
return 0;
}
时间复杂度:
稳定性:
归并排序是把序列递归地分成短序列,递归出口是短序列只有1个元素(认为直接有序)或者2个元素(1次比较和交换),然后把各个有序的段序列合并成一个有 序的长序列,不断合并直到原序列全部排好序。可以发现,在1个或2个元素时,1个元素不会交换,2个元素如果大小相等也没有人故意交换,这不会破坏稳定 性。那么,在短的有序序列合并的过程中,稳定是否受到破坏?没有,合并过程中我们可以保证如果两个当前元素相等时,我们把处在前面的序列的元素保存在结 果序列的前面,这样就保证了稳定性。所以,归并排序也是稳定的排序算法。