插入排序对数组进行一半排序

时间:2019-02-21 12:43:32

标签: c++ algorithm sorting insertion-sort

我正在阅读DS和Algortihms的书。我看到了一种名为插入排序的算法,然后尝试将其应用于c ++。当我对数组进行排序时,数组的第一个元素将保留在先前的位置,而其他元素将移至其适当的位置!我不明白发生了什么。 我的代码:

#include<iostream>
#include<vector>

using namespace std;

void vec_in(vector<unsigned>& vec, unsigned size);
void vec_out(vector<unsigned> vec);

int main(){
    vector<unsigned> vec;
    unsigned size;
    cout<<"SIZE : ";
    cin>>size;
    cout<<"ARRAY : ";
    vec_in(vec,size);
    cout<<endl;
    for(unsigned j=1; j<size; j++){
        unsigned key = vec[j];
        unsigned i=j-1;
        cout<<key<<endl;
        while(i>0&&vec[i]>key){
            vec[i+1]=vec[i];
            i--;
        }
        vec[i+1]=key;
    }
    cout<<"SORTED ARRAY : ";
    vec_out(vec);

} 

void vec_in(vector<unsigned>& vec, unsigned size){
    for(unsigned i=0; i<size; i++){
        unsigned in;
        cin>>in;
        vec.push_back(in);
    }
    cout<<endl;
}
void vec_out(vector<unsigned> vec){
    for(unsigned i=0; i<vec.size(); i++){ 
        cout<<vec[i]<<" ";
    } 
    cout<<endl;
} 

我用许多示例尝试了此代码,结果仍然是相同的:第一个元素从未排序。

2 个答案:

答案 0 :(得分:3)

您应将while(i>0&&vec[i]>key){替换为while(i>=0&&vec[i]>key){。在这种情况下,i可能为负。因此,需要对其进行唱歌,即this code是有效的。

如果您希望保留自己的类型,则可以将所有i出现的位置替换为i-1并获取

#include<iostream>
#include<vector>

using namespace std;

void vec_in(vector<unsigned>& vec, unsigned size);
void vec_out(vector<unsigned> vec);

int main(){
    vector<unsigned> vec;
    unsigned size;
    cout<<"SIZE : ";
    cin>>size;
    cout<<"ARRAY : ";
    vec_in(vec,size);
    cout<<endl;
    for(unsigned j=1; j<size; j++){
        unsigned key = vec[j];
        unsigned i=j;
        cout<<key<<endl;
        while(i>0&&vec[i-1]>key){
            vec[i]=vec[i-1];
            i--;
        }
        vec[i]=key;
    }
    cout<<"SORTED ARRAY : ";
    vec_out(vec);

} 

void vec_in(vector<unsigned>& vec, unsigned size){
    for(unsigned i=0; i<size; i++){
        unsigned in;
        cin>>in;
        vec.push_back(in);
    }
    cout<<endl;
}
void vec_out(vector<unsigned> vec){
    for(unsigned i=0; i<vec.size(); i++){ 
        cout<<vec[i]<<" ";
    } 
    cout<<endl;
} 

which works as well

请注意,您的方法需要 N ^ 2 个步骤(其中 N 是向量的大小)。有很多更好的方法,例如快速排序,只需要 log(N)N 个步骤即可完成。标准库实现了这样的算法。因此,您应该始终使用std::sort进行排序。

答案 1 :(得分:1)

假设我们只有两个元素:43

现在,进入for循环时会发生什么。

    for(unsigned j=1; j<size; j++){
        unsigned key = vec[j];         /* key := 3      */
        unsigned i=j;                  /* i := 1        */
        cout<<key<<endl;               /* print(3)      */
        while(i>0&&vec[i-1]>key){      /* i > 0 (false) */
            vec[i]=vec[i-1];
            i--;
        }
        vec[i]=key;
    }

未输入进行排序的while循环。尝试将vec[0]vec[1]进行比较时,总是会发生这种情况。

根据经验,请第一次进行以下测试:

1) empty vector
2) vector with one element
3) vector with two elements a) sorted acending b) sorted descending
...

它们将使您快速找到较小的错误。