【问题标题】:Selection Sort through malloc function通过 malloc 函数进行选择排序
【发布时间】:2014-03-08 14:24:43
【问题描述】:
#include<stdio.h>
#include<stdlib.h>
int main()
{
    int i,n,min,j;
    int *array; 
    printf("The no of elements >> ");
    scanf("%d\n",&n);
    printf("Making array\n" );
    array = (int *)malloc (sizeof(int) * n);
    printf("array made!\n");

    //INPUT NUMBERS
    for (i=0 ; i<n ; i++)
        {
            printf(">>Enter the element %d\n" , i+1);
            scanf("%d\n", &array[i]);
        }

    //SORT THE ARRAY
    for (i = 0; i < n; ++i)
        {
            min = array[0];
            for (int j = i+1; j < n; ++j)
            {
                if (array[i] > array[j])
                    min = array[j];
            }
            if (min != array[i])
            {
                int temp;
                temp = array[i];
                array[i]= min;
                array[j]=temp;
            }
        }

    //PRINTING ARRAY
    for (i=0 ; i<n ; i++)
        {
            printf("-- %d --\n" , array[i]);
        };
}

我有这个在 c 中使用 Malloc 用于数组的 SelectionSort 的特定代码。但是,它在“元素数>>”之后经过两次输入,也不会排序。 如果我继续这样下去,它会以以下方式给我一个未排序的数组

The no of elements >> 5
4
Making array
array made!
>>Enter the element 1
5
>>Enter the element 2
2
>>Enter the element 3
1
>>Enter the element 4
7
>>Enter the element 5
8
-- 7 --
-- 1 --
-- 1 --
-- 2 --
-- 1 --

我已阅读其他一些帖子并更正了我的代码,但这仍然行不通。 不知道为什么。

编辑 1 通过对代码进行一些更改,双重输入的问题确实得到了解决。

int main()
{   int i,n,min,j;
    int *array; 
    printf("The no of elements >> ");
    scanf("%d",&n);
    array = (int *)malloc (sizeof(int) * n);

    for (i=0 ; i<n ; i++)
        {
            printf(">>Enter the element %d\n" , i+1);
            scanf("%d", &array[i]);
        }

    //SORT THE ARRAY
    for (i = 0; i < n; ++i)
        {
            min = array[i];
            for (int j = i+1; j < n; ++j)
            {
                if (array[i] > array[j])
                    min = array[j];
            }
            if (min != array[i])
            {
                int temp;
                temp = array[i];
                array[i]= min;
                array[j]=temp;
            }
        }

    //PRINTING ARRAY
    for (i=0 ; i<n ; i++)
        {
            printf("-- %d --\n" , array[i]);
        };
}

但是,现在输入仍然不正确

The no of elements >> 5
Making array
array made!
>>Enter the element 1
5
>>Enter the element 2
4
>>Enter the element 3
6
>>Enter the element 4
9
>>Enter the element 5
2
-- 9 --
-- 2 --
-- 2 --
-- 2 --
-- 2 --

编辑 2 经过几次更正,距离最终代码仍有一些错误,我在

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

int main()
{
    int i,n,min,j;
    int *array; 
    printf("The no of elements >> ");
    scanf("%d",&n);
    printf("Making array\n" );
    array = (int *)malloc (sizeof(int) * n);
    printf("array made!\n");

    //INPUT NUMBERS
    for (i=0 ; i<n ; i++)
        {
            printf(">>Enter the element %d\n" , i+1);
            scanf("%d", &array[i]);
        }

    //SORT THE ARRAY
    for (i = 0; i < n; i++)
        {
            min = i;
            for ( j = i+1; j < n; j++)
            {
                if (array[j] < array[i])
                    min = j;
            }
            if (min != i)
            {
                int temp;
                temp = array[i];
                array[i]= array[min];
                array[min]=temp;
            }
        }

    //PRINTING ARRAY
    for (i=0 ; i<n ; i++)
        {
            printf("-- %d --\n" , array[i]);
        };
}

这导致了一个有点排序但仍然不正确的数组

The no of elements >> 5
Making array
array made!
>>Enter the element 1
4
>>Enter the element 2
5
>>Enter the element 3
2
>>Enter the element 4
1
>>Enter the element 5
7
-- 1 --
-- 4 --
-- 2 --
-- 5 --
-- 7 --

编辑 3:最终代码 我多次编辑代码以进行命中和试用。我终于发现这段代码可以正常工作了。

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

int main()
{
    int i,n,min,j;
    int *array; 
    printf("The no of elements >> ");
    scanf("%d",&n);
    printf("Making array\n" );
    array = (int *)malloc (sizeof(int) * n);
    printf("array made!\n");

    //INPUT NUMBERS
    for (i=0 ; i<n ; i++)
        {
            printf(">>Enter the element %d\n" , i+1);
            scanf("%d", &array[i]);
        }

    //SORT THE ARRAY
    for (i = 0; i < n; ++i)
        {
            min = i;
            for ( j = i+1; j < n; ++j)
            {
                if (array[j] < array[min])
                    min = j;
            }
            if (min != i)
            {
                int temp;
                temp = array[i];
                array[i]= array[min];
                array[min]=temp;
            }
        }

    //PRINTING ARRAY
    for (i=0 ; i<n ; i++)
        {
            printf("-- %d --\n" , array[i]);
        };
}

不过,我仍然想知道为什么 ++i /++j 分别与 i++/j++ 相比没有区别。

【问题讨论】:

    标签: c arrays malloc


    【解决方案1】:

    应该是:

    scanf("%d",&n);
    

    不是:

    scanf("%d\n",&n);
    

    编辑

    在外部for循环内,应该是min = array[i];

    【讨论】:

    • 非常感谢您的帮助。而且我认为写“min”而不是“array[i]”不会导致排序数组。
    【解决方案2】:

    编辑 1 后,您的代码还有两个问题。

    中间循环中的j 隐藏了函数顶部声明的j。因此,虽然该内部 for 循环可能会找到要交换的正确索引,但该信息会在内循环结束后丢失。

    变化:

    for (int j = i+1; j < n; ++j)
    

    到:

    for (j = i+1; j < n; ++j)
    

    其次,您不应该跟踪最小元素的值。相反,您应该跟踪它的索引。在内循环之后,j 始终等于 n,因此您的代码会将最小元素分配给数组的每个元素。

    变化:

    min = array[i];
    // ...
        min = array[j];
    // ...
    if (min != array[i])
    // ...
        array[i]=min;
        array[j]=temp;
    

    到:

    min = i;
    // ...
        min = j;
    // ...
    if (min != i)
    // ...
        array[i]=array[min];
        array[min]=temp;
    

    【讨论】:

    • 非常感谢您的帮助。它在很大程度上纠正了代码并引导我进入编辑 2。但是,我不明白为什么我们应该完全跟踪索引而不是元素本身。
    • 如果不跟踪索引,则不知道将array[i] 与哪个位置交换。您只知道某个位置的值为min
    【解决方案3】:

    我认为应该是min = array[i]; 而不是min = array[0];

    【讨论】:

    • 是的,更正了。我意识到它一次又一次地与导致错误的第 0 个索引进行比较
    【解决方案4】:

    在,scanf("%d\n",&n); '\n' 告诉 scanf 读取但不保存。所以它等待读取一个非空白字符。

    【讨论】:

    • 感谢您提供的信息。会记住这一点。
    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    相关资源
    最近更新 更多