插入排序主要有直接插入排序和希尔排序
希尔排序是直接插入排序的威力增强版。将列表元素分成若干组,,如下图
{0,8,3,4,5,6,2,4,40,3}
1:步长gap=10/2=5,所以分组为:
{0,6},{8,2}{3,4},{4,40}{5,3}
将各组进行直接插入排序为{0,6},{2,8}{3,4},{4,40}{3,5}
所以第一次排序后的结果为{0,2,3,4,3,6,8,4,40,5}
2:步长gap=5/2=2(取整),所以分组为:
{0,3,5,2,40}{8,4,6,4,3}
将各组进行直接插入排序为{0,2,3,5,40},{3,4,4,6,8}
3:步长gap=2/2=1(取整),所以分组为:
{0,3,2,4,3,4,5,6,40,8}
最后结果为{0,2,3,3,4,4,5,6,8,40}
C++实现如下(代码已经测试):
#ifndef selectSort_h
#define selectSort_h
#include<iostream>
using namespace std;
class InsertSort{
public:
//直接插入排序O(n*n),稳定的算法。
void insertSort(int a[],int n);
//希尔排序,最好,平均,最坏情况时间复杂O(n),O(n^1.3),O(n*n),不稳定的算法
void hillSort(int a[],int n);
};
void InsertSort::insertSort(int a[],int n){
for(int i=0;i<n-1;i++){
int j=i+1;
int tmp=a[j];
while(j>0&&tmp<a[j-1]){
a[j]=a[j-1];
j--;
}
a[j]=tmp;
for(int i=0;i<10;i++)
cout<<a[i]<<" ";
cout<<endl;
}
}
void InsertSort::hillSort(int a[],int n){
//取初始步长为n/2,一直到步长为1
for(int i=n/2;i>=1;i=i/2){
//直接插入排序
for(int j=i;j<n;j++){
int tmp=a[j];
int k=j-i;
for(k;k>=0&&a[k]>tmp;k-=i){
a[k+i]=a[k];
}
a[k+i]=tmp;
}
}
}
#endif