数组排序倒退?

时间:2014-07-01 06:42:59

标签: c++ arrays sorting

好吧所以我有这个函数接受数组并使用交换排序(?)对其进行排序,但是当我输入数字时,它会从最大到最小而不是从最小到最大排序。

我经历了这样做,看看每一步都会发生什么,但这对我来说似乎都是正确的。

iterator = &first element
temp = smallest number
tempstore = &smallest number
val tempstore = val first element
val first element = val temp

如果我改变它

if(array[i] < *iterator)

变为:

 if(array[i] > *iterator)

它完美无缺,但我不明白这一点,因为它正在测试数字是否更大,我想要更小。

我知道我应该使用矢量,但我仍然是新手,我还没有学习它们。谢谢你的帮助。

int *sort(int *array, int size)
{
    int temp, *iterator, *tempStore;
    for(int j = 0; j < size; j++)
    {
        iterator = &array[j];
        for(int i = 0; i < size; i++)
        {
            if(array[i] < *iterator)
            {
                temp = array[i];
                tempStore = &array[i];
                *tempStore = *iterator;
                *iterator = temp;
            }
        }
    }
    return array;
}

1 个答案:

答案 0 :(得分:1)

您的算法将数组的第一个元素与后续所有元素进行比较,因此当您使用:

 if(array[i] > *iterator)

每次i元素大于第一个元素时,您都会将第一个元素与i元素交换。所以在第一遍结束时,你在第一个位置拥有最大元素。如果您使用<运算符,则会获得前面最小的运算符。

然后第二遍应该比较数组的第二个元素和所有后续元素,这就是i需要从j + 1开始迭代的原因。

正如您所看到的那样,阅读和理解代码并不简单,而且算法本身也很差(看起来像selection sort有一些额外的交换)。您不一定需要使用std::vector,但您确实应该学习标准库。

这是C ++ 11的方法:

#include <algorithm> //for std::sort
#include <iterator> //for std::begin/end
#include <functional> //for std::greater

int v[1000];
... fill v somehow ...
std::sort(std::begin(v), std::end(v), std::greater<int>());

紧凑,清晰,速度极快。