【问题标题】:Sorting an array meanwhile entering values在输入值的同时对数组进行排序
【发布时间】:2016-11-11 14:24:12
【问题描述】:

我需要在输入值时对数组进行排序,这意味着当用户输入数字时,数组需要对自身进行排序:到目前为止我所做的是:

void MoveRight(int *a,int n, int startIndex)
{
    int j,temp;
    j=n-1;
    for(int i=startIndex;i<n;i++)
    {
            temp = a[j];
            a[j]=a[i];
            a[i]=temp;
    }
}

void InsertionSort(int *a,int n)
{
    int i,number,j;
    printf("Enter %d numbers for the array\n",n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&number);
        for(j=0;j<=i;j++)
        {
            if(number<a[j])
            {
                MoveRight(a,n,j);
                a[j]=number;
                break;
            }
        }
    }
}

进入后:1,3,2,4,5

我得到的数组是:-858993460,-858993460,-858993460,-858993460,-858993460

【问题讨论】:

  • 什么是a?发布InsertionSort的电话
  • 数组a中的初始值是什么?当您输入 1 时,只有当数组中的任何元素大于 1 时,它才会进入数组。从您的输出中,数组包含小于 1-858993460,因此数组中没有存储任何值
  • 你需要修改InsertionSort的算法
  • 提示:-858993460 或(十六进制的 0xCCCCCCCC)是 Microsoft Visual Studio 调试版本用于未初始化自动变量的值。
  • 如果插入的值大于数组中的任何值,则不存储任何值。您需要检测该条件并在它发生时将值最后插入数组中。

标签: c arrays sorting insertion-sort


【解决方案1】:

要应用选择排序,您首先应该输入数组中的所有元素。

这些循环

for(i=0;i<n;i++)
{
    scanf("%d",&number);
    for(j=0;j<=i;j++)
    {
        if(number<a[j])
        {
            MoveRight(a,n,j);
            a[j]=number;
            break;
        }
    }
}

已经导致未定义的行为,因为当 ij 等于 0 时,a[j] 具有不确定的值。此外,如果条件number&lt;a[j] 未评估为真,则不会将任何内容添加到数组中。

函数MoveRight 没有意义,因为在循环变量j 没有改变。

j=n-1;
for(int i=startIndex;i<n;i++)
{
        temp = a[j];
        a[j]=a[i];
        a[i]=temp;
}

这是一个演示程序,展示了如何完成任务。

#include <stdio.h>

void MoveRight( int *a, int n, int i )
{
    for ( ; n != i; --n ) a[n] = a[n-1];
}

#define N   10

int main(void) 
{
    int a[N];

    printf( "Enter %d numbers for the array: ", N );

    for ( int i = 0; i < N; i++ )
    {
        int value;

        scanf( "%d", &value );

        int j = 0;
        while ( j < i && !( value < a[j] ) ) j++;

        MoveRight( a, i, j );
        a[j] = value;
    }

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

    return 0;
}

程序输出可能如下所示

Enter 10 numbers for the array: 5 2 3 9 8 1 6 7 4 0
0 1 2 3 4 5 6 7 8 9 

考虑到对于大型数组,使用二进制搜索而不是顺序搜索来查找插入下一个值的位置要好得多。

【讨论】:

  • 这不是我的意思。我想要的是:当用户输入每个值时,数组需要对其进行自我排序
  • @user6219654 我的程序是做什么的?!用户输入的每个值都放置在数组中的正确位置。
  • 对不起,我以为我可以在脑海中调试它,但我失败了。执行您的代码后,我发现您是对的 :( 。感谢您的帮助
  • @user6219654 没问题。我的功能与您尝试的功能相同。:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 2014-11-05
  • 2014-06-13
  • 2014-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多