关于#c语言#的问题:在学习C语言的选择循环排序,求解#include <stdio.h>

在学习C语言的选择循环排序,但是结果没出来,求解

#include <stdio.h>
#include <stdlib.h>

//

#define N 9
static void xz(void)
{
    int i,j,k,tmp;
    int a[N]={1,2,4,6,7,8,3,9,2};

    for(i=0;i<sizeof(a)/sizeof(a[i]);i++)
        printf("%d ",a[i]);
    printf("\n");

    for(i=0;i<N-1;i++)
    {
        k=i;
        for(j=i+1;j<N-1;j++)
        {
            if(a[j]<a[k])
                k=j;
//当a[1]<a[0],的时候k的值就不在等于i于是,便进行if判断
        }
/*为什么要定义K?,根据举例子,我们可以知道,k=i,当我们进入第二次排列的时候,这时候需要进行排序的就不是a[0],而是a[0+1],从a[0]+1这里开始进行第二轮的排序*/
        if(i != k)
        {
        /*也就是a[j]<a[i]的时候,然后我们再进行两两交换*/
            tmp=a[i];
            a[i]=a[k];
            a[k]=tmp;
        }

    }

    for(i=0;i<sizeof(a)/sizeof(a[i]);i++)
        printf("%d ",a[j]);
    printf("\n");

}

int main()
{
    xz();
    exit(0);
}
~   

选择排序的循环部分错了,选择排序是从第一个元素开始,依次和后面几个元素进行比较,将最大(最小)拿到第一个位置,之后重复此过程。k的作用是标记,将最大(最小)数的下标进行标记,将标记的这个下标的数与第一个数进行交换,之后重复此过程,这就是选择排序。

img

img

【以下回答由 GPT 生成】

问题解答

你的问题是你编写的选择排序函数没有正确输出排序结果。针对这个问题,我将提供一些可能导致错误的原因和解决方案,并解释代码中的一些技术细节。

错误分析

在你的代码中,存在两个问题导致排序结果输出不正确:

  1. 在内层循环中,j 的取值范围应该是从 i + 1N - 1,而不是 N - 1。这是因为你希望每次选择最小的元素放在已排序部分的末尾,所以内层循环的起始位置应该是已排序部分的下一个位置。

  2. 在输出排序结果时,你错误地使用了变量 j,而应该使用变量 i。这是因为在选择排序中,变量 i 循环控制已排序的部分,而变量 j 在内层循环中用于查找最小元素。

解决方案

修正上述的问题后,你可以得到正确的排序结果。下面是修正后的代码:

#include <stdio.h>
#include <stdlib.h>

#define N 9

static void selectionSort()
{
    int i, j, k, tmp;
    int a[N] = {1, 2, 4, 6, 7, 8, 3, 9, 2};

    for (i = 0; i < sizeof(a) / sizeof(a[i]); i++)
        printf("%d ", a[i]);
    printf("\n");

    for (i = 0; i < N - 1; i++)
    {
        k = i;
        for (j = i + 1; j < N; j++)  // 修正内层循环的结束条件
        {
            if (a[j] < a[k])
                k = j;
            // 当a[j] < a[k]时,更新k的值
        }

        if (i != k)
        {
            tmp = a[i];
            a[i] = a[k];
            a[k] = tmp;
        }
    }

    for (i = 0; i < sizeof(a) / sizeof(a[i]); i++)
        printf("%d ", a[i]);  // 修正输出变量为i
    printf("\n");
}

int main()
{
    selectionSort();
    exit(0);
}

这样修改后,你应该能够得到正确的排序结果。希望这个解决方案对你有帮助!



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
#include <stdio.h>
#include <stdlib.h>

#define N 9

static void xz(void) {
    int i, j, k, tmp;
    int a[N] = {1, 2, 4, 6, 7, 8, 3, 9, 2};

    for (i = 0; i < sizeof(a) / sizeof(a[i]); i++)
        printf("%d ", a[i]);
    printf("\n");

    for (i = 0; i < N - 1; i++) {
        k = i;
        for (j = i + 1; j < N; j++) {  // 修正此处的循环条件
            if (a[j] < a[k])
                k = j;
        }
        if (i != k) {
            tmp = a[i];
            a[i] = a[k];
            a[k] = tmp;
        }
    }

    for (i = 0; i < sizeof(a) / sizeof(a[i]); i++)
        printf("%d ", a[i]);
    printf("\n");
}

int main() {
    xz();
    exit(0);
}