数组排序中的逻辑错误

时间:2014-11-06 10:41:38

标签: c arrays sorting

问题 -
以这样的方式对数组进行排序:大于第一个元素的数字位于右侧且小于第一个元素位于左侧
示例输入 -
5
4 5 3 7 2(以4为参考)
示例输出
3 2 4 5 7
我的代码以这种方式排序
输入
5
12
16
2
3
56
输出
2 2 3月2
3
56

int main()
{

   int i,j,n,temp;
   printf("enter no of elements of array");
   scanf("%d",&n);
   int a[n];
   printf("enter array\n");
     for(i=0;i<=n-1;i++)
     {
     scanf("%d",&a[i]);
     }
   j=0;
   for(i=1;i<=n-1;i++)
   {
   if(a[i]<a[j])
     {
     temp=a[j];
     a[j]=a[i];
     a[i]=a[j];
     j++;
     }
   }
  for(i=0;i<n;i++)
  {
  printf("Array is%d\n",a[i]);
  }
}

4 个答案:

答案 0 :(得分:2)

首先,

 temp=a[j];
 a[j]=a[i];
 a[i]=a[j];

应该是

 temp=a[j];
 a[j]=a[i];
 a[i]=temp;

这解释了重复。但是一旦你排序了(哈哈)那你就会发现它不太正确,因为你只将每个数字与它的邻居进行比较 - 如果数组中的最后一个数字是最小的呢? - 您只能提前将其移动到一个位置(例如,5个数字列表中的第4个位置)。

答案 1 :(得分:1)

for(i=1;i<=n-1;i++)
{
 if(a[i]<a[j])
 {
 temp=a[j];
 a[j]=a[i];
 a[i]=a[j];// change to a[i]=temp;
 j++;
 }
}

在此循环中,您只尝试对数组元素进行排序。你必须修改你的排序机制,纠正交换函数的最后一个语句。

答案 2 :(得分:1)

此外,在您的计划中,您有一个variable length array which isn't valid in standard C.

printf("enter no of elements of array");
scanf("%d",&n);
int a[n];

它可能有效,但如果您尝试初始化为任何值或零,则可能会遇到以下错误。

[Error] variable-sized object may not be initialized  

这里a[n]将在堆栈上分配内存,这对于大型内存来说并不是很好。 您只能使用常量定义数组的长度。 (如) int a[10];

答案 3 :(得分:0)

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