【问题标题】:Tried to create sorting program, but isn't working as expected试图创建排序程序,但没有按预期工作
【发布时间】:2017-06-20 08:52:56
【问题描述】:

以下代码是为数组排序编写的。
这里程序给出了意想不到的输出结果。
错误应该在第 10-19 行。

#include<stdio.h>   //Sorting array program
int main()
{
    int arr[20],i,j,n,temp;
    printf("Enter number of elements  : ");
    scanf("%d",&n);
    printf("\nEnter the elements of the array : ");
    for (i=0;i<n;i++)
        scanf("%d",&arr[i]);
    for(i=0;i<n;i++)
    {
        for(j=0;j<arr[i];j++)
            if (arr[i+1]<arr[i])
            {
                temp=arr[i];
                arr[i]=arr[i+1];
                arr[i+1]=temp;
            }
    }
    printf("\nThe sorted list is : \n");
    for (i=0;i<n;i++)
        printf("\n arr[%d] : %d",i,arr[i]);
    return 0;
}

输出 :: 输入元素数量:4

     Enter the elements of the array : 5
     3
     2
     1

     The sorted list is : 

      arr[0] : 3
      arr[1] : 2
      arr[2] : 1
      arr[3] : -16777216
      Process returned 0 (0x0)   execution time : 8.161 s
      Press ENTER to continue.

【问题讨论】:

  • 闻起来像“索引越界”错误。
  • 这是哪种排序算法?我对内部 for 循环有疑问。
  • j&lt;arr[i] ??..
  • 我尝试创建自己的。它更像是冒泡排序+插入排序@Gaurav
  • @BLUEPIXY 感谢您的指出。

标签: c


【解决方案1】:

像这样修改你的程序,你会发现会发生什么:

#include <stdio.h>   //Sorting array program
#include <assert.h>

int main()
{
  int arr[20], i, j, n, temp;
  printf("Enter number of elements  : ");
  scanf("%d", &n);
  printf("\nEnter the elements of the array : ");

  for (i = 0; i<n; i++)
    scanf("%d", &arr[i]);

  for (i = 0; i<n; i++)
  {                                       // <<< line added
    for (j = 0; j < arr[i]; j++)
    {
      assert(j < n);                      // <<< line added
      assert(i + 1 < n);                  // <<< line added

      if (arr[i + 1] < arr[i])
      {
        temp = arr[i];
        arr[i] = arr[i + 1];
        arr[i + 1] = temp;
      }
    }                                     // <<< line added
  }

  printf("\nThe sorted list is : \n");

  for (i = 0; i<n; i++)
    printf("\n arr[%d] : %d", i, arr[i]);

  return 0;
}

了解assert here

但无论如何,算法对我来说看起来很可疑:

这行特别可疑:

for (j = 0; j < arr[i]; j++)

【讨论】:

  • 0: main: 断言 `i + 1
  • @Shushrut 正是,这就是重点:您正在访问数组最后一个元素之外的一个元素。
【解决方案2】:

试试这个

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>   //Sorting array program

int main()
{
    int arr[20], i, j, n, temp;

    printf("Enter number of elements  : ");
    scanf("%d", &n);
    printf("\nEnter the elements of the array : ");
    for (i = 0; i<n; i++)
        scanf("%d", &arr[i]);

    for (i = 0; i<n; i++)
    {
        for (j = 0; j<n; j++)
            if (arr[i]<arr[j])
            {
                temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
    }
    printf("\nThe sorted list is : \n");
      for (i = 0; i<n; i++)
         printf("\n arr[%d] : %d", i, arr[i]);
    printf("\n");

   return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    相关资源
    最近更新 更多