我使用C中的指针向升序程序编写了一个排序。逻辑上这个程序按递增顺序运行,但输出是降序。这个程序发生了什么。
这是我的代码:
#include<stdio.h>
#include<stdlib.h>
main()
{
int n,i,j,t,*ptr,sum=0;
printf("Enter number of elements to sort : ");
scanf("%d",&n);
ptr=(int*)malloc(n*sizeof(int));
if(ptr==NULL)
{ printf("Error occurred memory not allocated \n"); exit(0); }
printf("Enter the elements of Array \n");
for(i=0;i<n;i++)
{
scanf("%d",ptr+i);
}
for(i=0;i<n;i++){
for(j=0;j<n;j++)
{
if( *(ptr+i) > *(ptr+j))
{
t = *(ptr+i);
*(ptr+i) = *(ptr+j);
*(ptr+j) = t;
}
}
}
for(i=0;i<n;i++)
{
printf("\n%d\n",*(ptr+i));
}
free(ptr);
}
答案 0 :(得分:2)
两件事
1)对于升序,将if语句更改为
if( *(ptr+i) < *(ptr+j) )
2)您不需要每次检查整个阵列。您可以从前一个最低值的位置开始。
for(i=0; i<(n-1); i++){
for(j=i+1; j<n; j++) {
...
}
}
答案 1 :(得分:1)
好的,让我们一步一步地通过一个再现&#34;错误&#34;的测试用例来做。
假设数组的大小是5,用户输入是5,3,4,2,0,所以我们在iniliazization之后:
a[0]=5;
a[1]=3;
a[2]=4;
a[3]=2;
a[4]=0;
1) i = 0 ,j = 0 : (5 is not > 5) so no change
2) i = 0, j = 1 : (5 is > than 3) so a[0] -> 3 , a[1] -> 5
3) i = 0, j = 2 : (3 is not > 4) so no change
4) i = 0, j = 3 : (3 is > than 2) so a[0] -> 2 , a[3] -> 3
5) i = 0, j = 4 : (2 is > than 0) so a[0] -> 0 , a[4] -> 2
Now i=1;
1) i = 1, j = 0 : (5 is > than 0) so a[1] -> 0 , a[0] -> 5
你看,你又写了一个[0] = 5。这是算法的主要错误。如果要实现bubbleshort,请更好地查看算法(之后再检查一些更有效的排序算法,如quicksort。
答案 2 :(得分:1)
你的程序是正确的,但行:
if( *(ptr+i) > *(ptr+j))
按降序排列,只需输入该行:
if( *(ptr+i) < *(ptr+j))
,输出将按升序排列。
答案 3 :(得分:0)
我认为您正在尝试实施冒泡排序。第二个循环
中的代码存在逻辑问题for(j=0;j<n;j++)
将其更改为
for(j=1;j<n-1;j++).
我认为这将解决问题