插入排序
将一个元素插入到已排好序的元素序列中
*直接插入排序
#include<iostream>
using namespace std;
int main() {
int n,num[1005];
cin>>n;
for(int i=1;i<=n;i++) {
cin>>num[i];
}
for(int i=2;i<=n;i++) {
num[0]=num[i];
int j=i-1;
while(num[j]>num[0]) num[j+1]=num[j],j--;
num[j+1]=num[0];
}
for(int i=1;i<=n;i++) {
cout<<num[i]<<" ";
}
}
*折半插入排序
#include<iostream>
using namespace std;
int main() {
int n,num[1005];
cin>>n;
for(int i=1;i<=n;i++) {
cin>>num[i];
}
for(int i=2;i<=n;i++) {
num[0]=num[i];
int low=1,high=i-1,mid;
while(low<=high) {
mid=(low+high)/2;
if(num[mid]>num[0]) high=mid-1;
else low=mid+1;
}//折半查找后,low=high+1,应把数据填入low位置
for(int j=i-1;j>=low;j--) {
num[j+1]=num[j];
}
num[low]=num[0];
}
for(int i=1;i<=n;i++) {
cout<<num[i]<<" ";
}
}
*希尔排序
#include<iostream>
using namespace std;
int main() {
int n,num[1005];
int dk[4]={7,5,3,1};//增量数组,讲数据进行分组
cin>>n;
for(int i=1;i<=n;i++) {
cin>>num[i];
}
for(int k=0;k<4;k++) {
for(int i=1+dk[k];i<=n;i++) {//对之后每一个数进行插排
num[0]=num[i];//每个数插排前所在组的前面数据都已有序
int j=i-dk[k];
while(num[j]>num[0]&&j>0) num[j+dk[k]]=num[j],j-=dk[k];
num[j+dk[k]]=num[0];
}
}
for(int i=1;i<=n;i++) {
cout<<num[i]<<" ";
}
}