一. 插入排序
思想
:使前面部分有序,temp记录a[i],将比temp小(大)的一次往后挪,直到找到temp应该的位置,循环n次
AC(蒟蒻)代码:
#include<bits/stdc++.h>
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
using namespace std;
int n,a[100009],temp;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1,j;i<=n;i++){
temp=a[i];
for(j=i-1;j>=1&&temp<a[j];j--){
a[j+1]=a[j];
}
a[j+1]=temp;
}
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}
return 0;
}
一. 归并排序
思想
:利用分治的思想,先拆分成单个数,再用双指针有序的合并
AC(蒟蒻)代码:
#include<bits/stdc++.h>
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#define int long long
using namespace std;
int n,a[500009],c[500009];
void msort(int left,int right){
if(left==right) return;
int mid=left+right>>1,i=left,j=mid+1,k=left;
msort(left,mid);
msort(mid+1,right);
while(i<=mid&&j<=right){
if(a[i]<=a[j]) c[k++]=a[i++];
else c[k++]=a[j++];
}
while(i<=mid) c[k++]=a[i++];
while(j<=right) c[k++]=a[j++];
for(int l=left;l<=right;l++) a[l]=c[l];
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
msort(1,n);
for(int i=1;i<=n;i++) cout<<a[i]<<" ";
return 0;
}