插入排序及2种优化

原文:白话经典算法系列之八 MoreWindows白话经典算法之七大排序总结篇

#include <iostream>
#include <vector>
using namespace std;

void insertsort(vector<int> &vi){
    if(vi.size()<=1) return ;
    int n=vi.size();
    for(int i=1;i<n;++i){
        int temp=vi[i];
        int j=i-1;
        for(;j>=0 && vi[j]>vi[i];--j);//找到比vi[i]小的元素下标
        for(int k=i;k>j+1;--k){
            vi[k]=vi[k-1];
        }
        vi[j+1]=temp;
    }
}
//优化1:使代码从结构上与效率上都比insertsort更好。
void insertsort1(vector<int> &vi){
    if(vi.size()<=1) return ;
    int n=vi.size();
    for(int i=1;i<n;++i){
        int temp=vi[i];
        int j=i-1;
        for(;j>=0 && vi[j]>temp;--j)
            vi[j+1]=vi[j];
        vi[j+1]=temp;
    }
}
//优化2:这个只是优化结构,效率上比insertsort1要差
void insertsort2(vector<int> &vi){
    if(vi.size()<=1) return ;
    int n=vi.size();
    for(int i=1;i<n;++i){
        for(int j=i-1;j>=0 && vi[j]>vi[j+1];--j)
            swap(vi[j],vi[j+1]);
    }
}

int main(){
    vector<int> vi;
    vi={1,8,2,3,7,6,9,5,4};
//    insertsort(vi);
//    insertsort1(vi);
    insertsort2(vi);
    for(auto ieh: vi)
        cout<<ieh<<" ";
    cout<<endl;
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值