我正在阅读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;
}
我用许多示例尝试了此代码,结果仍然是相同的:第一个元素从未排序。
答案 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;
}
请注意,您的方法需要 N ^ 2 个步骤(其中 N 是向量的大小)。有很多更好的方法,例如快速排序,只需要 log(N)N 个步骤即可完成。标准库实现了这样的算法。因此,您应该始终使用std::sort
进行排序。
答案 1 :(得分:1)
假设我们只有两个元素:4
和3
。
现在,进入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
...
它们将使您快速找到较小的错误。