c ++无法通过选择排序来正常工作

时间:2014-09-11 12:05:51

标签: c++ sorting selection-sort

我正在尝试理解排序算法,所以基于googled示例/解释我写了下面的代码。代码在80%的时间都有效。每隔一段时间它就不能正常排序,我看不出原因。

#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

void setArray( int *, const int & );
void selectionSorting( int *, const int & );

int main()
{
    int numOfElem;
    cout << "Num of array elements: ";
    cin >> numOfElem;
    cout << '\n';

    int array[numOfElem];
    setArray(array, numOfElem);

    selectionSorting(array, numOfElem);

    cout << '\n';
    return 0;
}

void setArray( int *array, const int & numOfElem ){
    srand(time(0));
    cout << "Original array: " << '\n';
    for (int i=0; i<numOfElem; i++){
        array[i] = rand()%30;
        cout << array[i] << ' ';
    }
    cout << '\n';
}

void selectionSorting( int *array, const int &numOfElem ){
    int eff_size, swap;
    int maxpos = 0;
    for (eff_size = numOfElem; eff_size>1; eff_size--){
        // loop searching for a position of largest number in the array
        for (int i=0; i<eff_size; i++){
            maxpos = array[i] > array[maxpos] ? i : maxpos;
        }
        swap = array[maxpos];
        array[maxpos] = array[eff_size-1];
        array[eff_size-1] = swap;
    }
    cout << "Selection Sorting: " << '\n';
    for (int i=0; i<numOfElem; i++){
        cout << array[i] << ' ';
    }
}

示例输出:

Num of array elements: 5

Original array:
7 17 1 12 25
Selection Sorting:
1 7 17 25 12

我看不到排序失败的任何模式 - 它在不同的地方失败,天气有重复的数字,无论我提供多少数字等...

1 个答案:

答案 0 :(得分:4)

在外循环的每次迭代中(超过eff_size),您应该将maxpos重新设置为0.否则,您有可能maxpos超出正在排序的有效部分(如果最大元素在有效部分中是最后一个,即maxpos==effsize),则会发生这种情况。