-
前言:
数据序列1: 13-17-20-42-28 利用插入排序,13-17-20-28-42. Number of swap:1;
数据序列2: 13-17-20-42-14 利用插入排序,13-14-17-20-42. Number of swap:3;
如果数据序列基本有序,使用插入排序会更加高效。 -
基本思想:
在要排序的一组数中,根据某一增量分为若干子序列,并对子序列分别进行插入排序。
然后逐渐将增量减小,并重复上述过程。直至增量为1,此时数据序列基本有序,最后进行插入排序。 -
平均时间复杂度:O(n^1.5)
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
scanf("%d",&n);
int a[n];
for(int i = 0 ; i < n ; i++){
scanf("%d",&a[i]);
}
int len1 = n;
int item;//转换值
while(1){
len1 /= 2;
if(len1 == 0){
break;
}
for(int i = 0 ; i < len1 ; i++){//每个要一起进行插入排序的数之间相隔个数
for(int j = i+len1 ; j < n ; j+=len1){//插入排序算法
for(int k = j ; k > i ; k-=len1){
if(a[k] < a[k-len1]){
item = a[k-len1];
a[k-len1] = a[k];
a[k] = item;
}
}
}
}
}
for(int i = n-1 ; i >= 0 ; i--){//逆序输出
printf("%d ",a[i]);
}
}