下面的选择排序算法有什么问题

时间:2019-06-27 14:49:57

标签: c selection-sort

void main()
{
    int a[] = { 10, 3, 4, 2, 1, 0 };
    int i = 0;
    int temp_index;
    int temp_min;
    int temp;
    a[i];
    int j;
    a[j];
    int n = sizeof(a) / sizeof(int);
    for (; i < n - 1; i++)
    {
        int temp_min = i;
        int j = i + 1;
        for (; j < n; j++)
        {
            if (a[i] > a[j])
            {
                temp_min = j;
            }
        }

        int temp = a[temp_min];
        a[temp_min] = a[i];
        a[i] = temp;
    }

    int k = 0;

    for (; k < n; k++)
    {
        printf("%d", a[k]);
    }
}

2 个答案:

答案 0 :(得分:1)

您比较

if (a[i] > a[j]) {
    temp_min = j;
}

而不是 if (a[temp_min] > a[j]) { ... }

答案 1 :(得分:-1)

选择排序从a [i] .. a [n-1]到第i个位置中选择最小的数字。要实现此目的,您可以更改for循环-

for (; i < n - 1; i++)
{
    int temp_min = a[i];
    int swapIndex=-1;
    int j = i + 1;
    for (; j < n; j++)
    {
        if (temp_min > a[j])
        {
            temp_min = a[j];
            swapIndex = j;
        }
    }
    if(swapIndex !=-1){
    a[swapIndex] = a[i];
    a[i] = temp_min;
    }

}

还可以更改

 if (a[i] > a[j])
 {
            temp_min = j;
 }

将您的代码添加到此-

if (a[temp_min] > a[j])
 {
     temp_min = j;
 }

它将起作用,但在这种情况下-

int temp = a[temp_min];
a[temp_min] = a[i];
a[i] = temp;

对于已经排序的数组,例如{1,2,3,4}

,此交换部分将是多余的