插入排序

插入排序主要有直接插入排序和希尔排序

希尔排序是直接插入排序的威力增强版。将列表元素分成若干组,,如下图

{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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值