//我竟不会写伪码…
1.<插入排序>//稳定
时间复杂度:最好情况:原本有序,只用比较n次。最坏情况:原本逆序,比较n(n-1)/2次。平均复杂度为O(n2)
空间复杂度:需要一个辅助空间记录将插入的值,空间复杂度O(1)
void insert(int* a,int n){
for(int i=1;i<n;++i){
int end=i,key=a[i];
while(end&&a[i]<a[i-1]){
a[end]=a[end-1];
--end;
}
a[end]=key;
}
}
2.<希尔排序>//不稳定
时间复杂度:平均复杂度为O(n(1.3~2))
空间复杂度:同插入排序所以也为O(1)
void shellsort(int* a,int n){
int gap=n;
while(gap>1){
gap=gap/3+1;
for(int i=gap;i<n;++i){
int end=i,key=a[i];
while(end&&a[end]<a[end-gap]){
a[end]=a[end-gap];
end-=gap;
}
a[end]=key;
}
}
}
3.<选择排序>//不稳定
时间复杂度:不论怎么选都要比较n(n-1)/2次,最好、最坏、平均复杂度都为O(n2)
空间复杂度:O(1)
void selectsort(int* a,int n){
int begin=0,end=n-1;
while(begin<end){
int min=begin,max=end;
for(int i=begin-1;i<end;++i){
if(a[i]<a[min])
min=i;
if(a[i]>a[max])
max=i;
swap(a[min],a[begin