排序C++,第一个元素不工作

Sorting C++, First element not working

本文关键字:工作 元素 第一个 C++ 排序      更新时间:2023-10-16

请看一下这段代码。它应该按非递减顺序对其进行排序,但出于某种原因,它将最大的元素放在第一位,然后将其余元素按正确顺序排列。

int min(int start)
    {
        int minimum = list[start];
        int location = 0;
        for (int i = start; i < size; i++)
        {
            if (list[i] < minimum)
            {
                minimum = list[i];
                location = i;
            }
        }
        return location;
    }
    void sort()
    {
        int minimum;
        for (int i = 0; i < size; i++)
        {
            minimum = min(i);
            int temp = list[i];
            list[i] = list[minimum];
            list[minimum] = temp;
        }
    }

@Slava解释了您现有代码被破坏的原因以及如何修复。

我想提供一个替代的解决方案-学习使用标准STL算法。

std::sort()算法:

按升序对范围[第一个,最后一个)中的元素进行排序

#include <algorithm>
void sort()
{
    std::sort(&list[0], &list[size]);
}

即使您想要实现自己的sort()逻辑(尽管std::sort()确实允许您传入自定义函子来实现自定义排序),您的min()函数也可以使用STL std::min_element()算法,而sort()函数也可以采用STL std::swap()算法:

#include <algorithm>
int min(int start)
{
    int *found = std::min_element(&list[start], &list[size]);
    return std::distance(&list[0], found);
}
void sort()
{
    for (int i = 0; i < size; i++)
    {
        int minimum = min(i);
        if (minimum != i)
            std::swap(list[i], list[minimum]);
    }
}
int location = 0;

如果list[start]已经是最小值并且start!=0您返回的位置不正确。将其更改为

int location = start;

或者您可以使用start而不是location:

int min(int start)
{
    for (int i = start + 1; i < size; i++)
    {
        if (list[i] < list[start])
            start = i;
    }
    return start;
}