选择通过malloc函数排序

时间:2014-03-08 14:24:43

标签: c arrays malloc

#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]);
        };
}

我使用Malloc for arrays在c中使用了SelectionSort的这个特殊代码。但是,在“没有元素&gt;&gt;”之后进入2次输入。也不会排序。 如果我按照它的方式继续下去,它会以下列方式给我一个未排序的数组

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 ++相比毫无差别。

4 个答案:

答案 0 :(得分:2)

应该是:

scanf("%d",&n);

NOT:

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

修改

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

答案 1 :(得分: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 :(得分:0)

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

答案 3 :(得分:0)

In,scanf(“%d \ n”,&amp; n); '\ n'告诉scanf读取但不保存。因此它等待读取非空白字符。