矢量上的插入排序

Insertion sort on vector

本文关键字:插入排序      更新时间:2023-10-16

我想使用向量::begin和向量:::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行的某个地方,但我不知道问题是什么,因为指针等使问题变得有些复杂。

只是几个注意事项。首先,正如@appleapple所建议的,isSorted的实现是不正确的,因为您只将数组的第一个元素与其他元素进行比较。(即,如果第一个元素比其他所有元素都小,则认为数组已排序)。

第19行

int*指针;

该指针未初始化,最好将其初始化为指向数组的某个元素。

在第23行

*pointer=*it;

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

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

在这种情况下,您可以用替换线路

指针=&(*它);

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

线路出现问题

int最小=*x;

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