使用C程序中的指针排序

时间:2014-06-18 10:22:28

标签: c sorting pointers

我使用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);
}

4 个答案:

答案 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++). 

我认为这将解决问题