插入排序及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;
}


猜你喜欢

转载自blog.csdn.net/o1101574955/article/details/75453284