参考链接:https://mp.weixin.qq.com/s/4kJdzLB7qO1sES2FEW0Low
改造直接插入排序: 加入gap,1变为gap
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int a[10010];
int XInsSort(int n) {
int cur;
//在插入排序的基础上增加了一个控制增量(gap)的循环
//最初为数组长度的一半
//下一次增量为上一个增量的一半,最终增量为1就是一组
for(int gap=n/2;gap>0;gap/=2) {//分组
for(int i=gap;i<n;i++){//对各个分组进行直接插入排序
cur=a[i];
int j=i-gap;//插入之前定义j,改变j-1
for(;(j>=0)&&(cur<a[j]);j-=gap){//j--改为 j-=gap
a[j+gap]=a[j];//改a[j+1]=a[j];
}
a[j+gap]=cur;//改a[j+1]=cur;
}
}
}
int main()
{
int n=7;
for(int i=0;i<n;i++){
cin>>a[i];
}
XInsSort(n);
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}
无注释代码
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int a[10010];
int XInsSort(int n) {
int cur;
for(int gap=n/2;gap>0;gap/=2) {
for(int i=gap;i<n;i++){
cur=a[i];
int j=i-gap;
for(;(j>=0)&&(cur<a[j]);j-=gap){
a[j+gap]=a[j];
}
a[j+gap]=cur;
}
}
}
int main()
{
int n=7;
for(int i=0;i<n;i++){
cin>>a[i];
}
XInsSort(n);
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}