在矢量上插入排序

时间:2017-11-15 14:55:10

标签: c++ insertion-sort

我想使用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行的某个地方,但是我无法弄清楚问题是什么,因为指针等使它有些复杂。

1 个答案:

答案 0 :(得分:0)

只是几个笔记。 首先,正如@appleapple建议的那样,你的isSorted实现是不正确的,因为你只是比较第一个元素和数组的每个其他元素。 (即如果第一个元素小于其他所有元素,则将数组视为已排序)。

第19行

int * pointer;

这个指针没有初始化,最好初始化它指向数组的某个元素。

第23行

* pointer = * it;

在这里,您将指向它的值分配给指针指向的地址。但是,这意味着如果指针未初始化,您可能会使应用程序崩溃。如果它已初始化,您将覆盖指针所指向的数组的值。

我想你要做的是让指针指向与迭代器相同的地址。

在这种情况下,您可以用

替换该行

指针=&amp;(* it);

最后,我认为你缺少一个循环,因为每次循环时你都将全局最小值作为当前最小值,而你应该在向量中向前滑动每个新的最小值。

问题在于

int smallest = * x;

你应该在while和this行之间有另一个循环,这样在每个循环中,你可以将最小值设置为第一个非排序元素,而不是数组的第一个元素。