在输入值的同时对数组进行排序

Sorting an array meanwhile entering values

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

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

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

这些循环

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<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 

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