我是初学者,正在练习 C 选择排序,但会针对不同的值获得不同的输出

I'm a beginner and practising C selection sort but getting different output for different values

我有以下执行选择排序的代码:

#include<stdio.h>
    int main(){
       //selection_sort(int,int);
       int a[] = {55,932,53,98};
       int n = sizeof(a)/sizeof(a[0]);
    //    printf("%d \n",n);
       
       printf("Array before sorting: ");
       for (int i = 0; i < n; i++){
           printf("%d ", a[i]);
       }
       selection_sort(a,n);
       printf("Array after sorting: ");
       for (int k = 0; k < n; k++){
           printf("%d ", a[k]);
       }
    }
    int selection_sort(int a[], int n){
        int i,j,minidx,tmp;
        //int a[size];
        for (i = 0; i < n - 1 ; i++){
            minidx = i;
            for (j = i + 1; j < n; j++){
                if (a[minidx] > a[j]){
                        minidx = j;
                        swap_elements(&a[minidx], &a[i]);
                }
            }
        }
    }
    int swap_elements(int *a, int *b){
        int tmp = *a;
        *a = *b;
        *b = tmp;
    }

我已经为数组尝试了不​​同的值,它正在随机化精度。我在做什么不该做的事?

在这个 if 语句中

            if (a[minidx] > a[j]){
                    minidx = j;
                    swap_elements(&a[minidx], &a[i]);
            }

调用函数swap_elements后,索引为minidx的元素不代表当前最小值。它表示存储在 a[i].

中的先前值

实际上,当您在发现小于元素 a[i] 的元素时立即进行交换时,使用您的方法,变量 minidx 只是多余的。你可以改写

            if (a[i] > a[j]){
                    swap_elements(&a[i], &a[j]);
            }

或者你可以这样写

    for (i = 0; i < n - 1 ; i++){
        minidx = i;
        for (j = i + 1; j < n; j++){
            if (a[minidx] > a[j]){
                    minidx = j;
            }
        }

        if ( i != minidx ) swap_elements( a + minidx, a + i );
    }

你的函数也有 return 类型 int 但 return 没有 这两个函数应该有 return 类型 void.

并且函数 selection_sort 的第二个参数应该具有类型 size_t 而不是类型 int。相应地,变量 n 应该声明为

 size_t n = sizeof(a)/sizeof(a[0]);

并且您应该在使用它们的最小范围内声明变量。

函数可以通过以下方式声明和定义

void selection_sort( int a[], size_t n )
{
    for ( size_t i = 0; i < n  ; i++ )
    {
        size_t minidx = i;
        for ( size_t j = i + 1; j < n; j++ )
        {
            if ( a[j] < a[minidx] ) minidx = j;
        }

        if ( i != minidx ) swap_elements( a + minidx, a + i );
    }
}

注意所有被调用的函数必须在调用前声明。

除了调用交换元素外,您的选择排序算法是正确的。找到最小元素后应交换元素。

#include<stdio.h>
int swap_elements(int *a, int *b){
    int tmp = *a;
    *a = *b;
    *b = tmp;
}
int selection_sort(int a[], int n){
    int i, j, minidx;
    for (i = 0; i < n - 1 ; i++){
        minidx = i;
        for (j = i + 1; j < n; j++){
            if (a[minidx] > a[j]){
                minidx = j;
            }
        }
        swap_elements(&a[minidx], &a[i]);
    }
}

int main(){
   int a[] = {64, 25, 12, 22, 11};
   int n = sizeof(a) / sizeof(a[0]);
   
   printf("Array before sorting: ");
   for (int i = 0; i < n; i++){
       printf("%d ", a[i]);
   }
   selection_sort(a, n);
   printf("Array after sorting: ");
   for (int k = 0; k < n; k++){
       printf("%d ", a[k]);
   }
}

试试这个代码。