为什么我的SelectionSort不能一直工作?

时间:2019-03-11 18:21:15

标签: c algorithm sorting selection

我是一个初学者,现在我正在尝试第二天为实践目的实现SelectionSort。 我拥有的算法大多数时候都有效,但并非总是如此。不幸的是,对于我来说,它并不总是有效的,这是完全不清楚的。 这个例子就是一个不起作用的例子。

#include <stdio.h>

int* selectionSort(int a_count, int *a);

int main(void)
{
    int a[] =     {4,2,3,4,4,9,98,98,3,3,3,4,2,98,1,98,98,1,1,4,98,2,98,3,9,9,3,1,4,1,98,9,9,2,9,4,2,2,9,98,4,98,1,3,4,9,1,98,98,4,2,3,98,98,1,99,9,98,98,3,98,98,4,98,2,98,4,2,1,1,9,2,4};
    int i, a_count = 73;
    int *result = selectionSort(a_count, a);
        for(i = 0; i < a_count; i++){
            printf("%i ", result[i]);
        }
    return 0;
}   

int* selectionSort(int a_count, int* a) {
    int i, j, min = 0, tmp;
    for(i = 0; i < a_count - 1; i++){
        min = i;
        printf("min_i = %i\n", min);
        for(j = i + 1; j < a_count; j++){
            printf("j = %i ", j);
                if(a[j] < a[min]){
                printf("%i < %i\n", a[j], a[min]);
                printf("min is changed: ");
                min = j;
                printf("min_j = %i\n", min);
            }
            tmp = a[i];
            a[i] = a[min];
            a[min] = tmp;
        }
   }
   return a;
}

非常感谢您的帮助!

4 个答案:

答案 0 :(得分:0)

您在i上的每次循环中都将元素min与元素j交换。这既不正确又效率低下。在内部循环完成之后执行交换,以便实际上min包含当前子数组的最小值的索引,而不是在您仍然试图找出该元素的位置时。

答案 1 :(得分:0)

有一个简单的错误,那就是您不等到内循环结束才进行交换。

100px

现在输出正确。

答案 2 :(得分:0)

您有两个循环,在外部循环中,首先设置min,然后在内部循环中,更改min,从而弄乱了min的值,并使交换代码错误。 您可以删除有关min的所有代码,直接使用i,j,然后应该可以工作。 更改 if(a [j]

答案 3 :(得分:0)

public static class SelectionSort
{
    static int min;
    public static void Sort(int[] data)
    {
        for (int i = 0; i < data.Length; i++)
        {
            for (int j = 0; j < data.Length; j++)
            {
                min = j;
                if (data[i] < data[j])
                    Swap(x: ref data[i], y: ref data[min]);
            }
        }
    }

    private static void Swap(ref int x, ref int y)
    {
        int temp = x;
        x = y;
        y = temp;
    }
}