簡體   English   中英

C ++選擇排序(向量)

[英]C++ Selection Sort (vectors)

int temp;
for (int j = 0; j < vecsize - 1; ++j) {

    int min = sort.at(j);
    for (int i = j+1; i < vecsize; ++i) {
        if (min > sort.at(i)) {
            min = sort.at(i);  
            temp = i;
        }

    }  
swap(sort.at(j), sort.at(temp));
}

我正在嘗試按以下順序對向量進行排序:23 42 4 16 8 15

但是,我嘗試使用選擇排序輸出:4 8 15 23 16 42

我究竟做錯了什么?

當您定義min時,您似乎正在為其分配第j個索引處的數組排序的值。 但是,您正在使用額外的變量tmp交換元素,並且似乎無法在內部for循環之前對其進行初始化,類似於初始化min的方式。 而且,如果數組中的所有其他元素都小於sort [j]處的元素,則tmp將針對外循環的該迭代未初始化,這可能會導致其中的值不正確。

int temp;
for (int j = 0; j < vecsize - 1; ++j) {
    int min = sort.at(j);
    temp = j;                                     # HERE'S WHAT'S NEW
    for (int i = j+1; i < vecsize; ++i) {
        if (min > sort.at(i)) {
            min = sort.at(i);  
            temp = i;
        }
    }  
    swap(sort.at(j), sort.at(temp));
}

您可能會在這里看到此代碼。 似乎產生了所需的輸出。

試試這個: 更正代碼

#include <iostream>
#include <vector>
using namespace std;

void print (vector<int> & vec) {
    for (int i =0 ; i < vec.size(); ++i) {
        cout << vec[i] << " ";
    }
    cout << endl;
}

int main() {
int temp;
vector<int> sort;

sort.push_back(23);
sort.push_back(42);
sort.push_back( 4);
sort.push_back( 16);
sort.push_back( 8);
sort.push_back(15);
print(sort);

int vecsize = sort.size();
for (int j = 0; j < vecsize - 1; ++j) {

    int min = j;
    for (int i = j+1; i < vecsize; ++i) {
        if (sort.at(min) > sort.at(i)) {
            min = i;
        }

    }  
    if (min != j)
        swap(sort.at(j), sort.at(min));
}

print(sort);
return 0;
}

如果可以使用C ++ 11,則還可以使用lambda解決排序問題(如您的示例所示)。 這是一種更強大,更優化的方法。 您應該在將來嘗試。

[EDITED]:

一個簡短的例子:

// Example program
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

int main()
{
    std::vector<int> myVector;

    myVector.emplace_back(23);
    myVector.emplace_back(42);
    myVector.emplace_back(4);
    myVector.emplace_back(16);
    myVector.emplace_back(8);
    myVector.emplace_back(15);

    std::sort(myVector.begin(), myVector.end(),
       [](int a, int b) -> bool
    {
       return a < b;
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM