我想使用vector :: begin和vector :: end对矢量进行插入排序。 这是我的代码:
#include <iostream>
#include <vector>
using namespace std;
//Checking if vector is sorted
bool isSorted(vector<int>::iterator x, vector<int>::iterator y) {
for (vector<int>::iterator it = x; it != y; ++it) {
if (*x > *it) return false;
}
return true;
}
//Doing insertion sort algorithm
void insertionSort(vector<int>::iterator x, vector<int>::iterator y) {
while(!isSorted(x, y)) {
int smallest = *x;
int* pointer;
for (vector<int>::iterator it = x; it != y; ++it) {
if (*it < smallest) {
smallest = *it;
*pointer = *it;
}
}
int buffer = *x;
*x = smallest;
*pointer = buffer;
}
}
int main() {
vector<int> list;
list.push_back(5);
list.push_back(3);
list.push_back(4);
list.push_back(0);
list.push_back(10);
list.push_back(1);
//Displaying
for (int i = 0; i < list.size(); i++) {
cout << list[i] << endl;
}
insertionSort(list.begin(), list.end());
//Displaying after sort
cout << "\nafter sort" << endl;
for (int i = 0; i < list.size(); i++) {
cout << list[i] << endl;
}
}
这是输出:
5
3
4
0
10
1
after sort
0
3
4
0
10
1
排序后的预期输出:0,0,1,3,4,10。 插入排序无法按预期工作。在函数insertionSort()中,我想迭代直到找到最小元素,如果找到第一个索引就位于其中。
我猜这个问题发生在第28行的某个地方,但是我无法弄清楚问题是什么,因为指针等使它有些复杂。
答案 0 :(得分:0)
只是几个笔记。 首先,正如@appleapple建议的那样,你的isSorted实现是不正确的,因为你只是比较第一个元素和数组的每个其他元素。 (即如果第一个元素小于其他所有元素,则将数组视为已排序)。
第19行
int * pointer;
这个指针没有初始化,最好初始化它指向数组的某个元素。
第23行
* pointer = * it;
在这里,您将指向它的值分配给指针指向的地址。但是,这意味着如果指针未初始化,您可能会使应用程序崩溃。如果它已初始化,您将覆盖指针所指向的数组的值。
我想你要做的是让指针指向与迭代器相同的地址。
在这种情况下,您可以用
替换该行指针=&amp;(* it);
最后,我认为你缺少一个循环,因为每次循环时你都将全局最小值作为当前最小值,而你应该在向量中向前滑动每个新的最小值。
问题在于
行int smallest = * x;
你应该在while和this行之间有另一个循环,这样在每个循环中,你可以将最小值设置为第一个非排序元素,而不是数组的第一个元素。