数组按降序在C中不起作用

时间:2013-08-15 20:57:41

标签: c

      #include <stdio.h>

      int main()

      {
        int a[100],i,n,j,p;
        printf("Enter number of elements:\n ");
        scanf("%d",&n);
        printf("Enter array:\n");
        for(i=0;i<n;i++)
        {
          scanf("%d",&a[i]);
        }
        for(i=0;i<n;i++)
        {
          for(j=1;j<n;j++)
          {
            if(a[i]>a[j])
            {
              p=a[j];
              a[j]=a[i];
              a[i]=p;
            }
          }
        }
        printf("The array looks :\n");
        for(i=0;i<n;i++)
        {
          printf("%d\t",a[i]);
        }
          return 0;
      }

除了最小的元素仍然是第一个之外,这是顺利的:(当我运行它时它没有错误,但是当我输入例如1,2,3,4,5的数字时它结果是1 5 4 3 2。

8 个答案:

答案 0 :(得分:4)

请使用您的代码更加有条理!

这是一个看起来更整洁的版本:

#include <stdio.h>

void swap(int* a, int* b)
{
    int t = *a;
    *a = *b;
    *b = t;
}

void selectionSort(int a[], int n)
{
    int i, j;
    for (i = 0; i < n; i++)
        for (j = i + 1; j < n; j++)
            if (a[i] > a[j])
                swap(&a[i], &a[j]);
}

main()
{
    int n;
    printf("Enter the number of elements: ");
    scanf("%d", &n);

    int a[n], i;
    printf("Enter the array:\n");
    for (i = 0; i < n; i++) scanf("%d", &a[i]);

    selectionSort(a, n);

    printf("The array looks like this:\n");
    for (i = 0; i < n; i++) printf("%d ", a[i]);
}

答案 1 :(得分:1)

简单地改变你的内心&#34;为&#34;循环如下:

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

这允许您遍历整个阵列&#34; n&#34;根据需要将两个连续数组元素之间的较大数字向下冲1,直到整个列表被排序。所以使用你的1,2,3,4,5和n = 5的例子,&#34;快照&#34;执行内部for循环后的数组是[51234],[54123],[54312],[54321],此时i = 4,因此for循环测试失败并且您的数组已排序。 。 。希望这有帮助

答案 2 :(得分:0)

我建议你在互联网上查找bubblesort算法。

在这里:

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

在此,第一个for的第二次迭代不考虑a[0],因此您将通过相关数字。

没关系。假设a[j]是您要排序的“移动”元素(最大到较低),您应该使用j=0开始第二个循环,以便对所有元素进行排序。

答案 3 :(得分:0)

问题在于嵌套循环。您正在实现交换但不考虑数组中的所有元素。要解决此问题,请更改以下内容:

for ( i = 0 ; i < n; i++ ) {
  for ( j = 1; j < n; j++ ) {

......来:

for ( i = 0 ; i < n; i++ ) {
  for ( j = 0; j < n; j++ ) {

...这两个循环将在O(n ^ 2)时间内对数组进行排序。如果你实现其他排序算法(并且正确地执行),你可以做得更好,我建议你优化你的代码。考虑一下冒泡排序的这种实现:

bool swapped;

do {
  swapped = false;

  for ( int i = 0; i < ( n - 1 ); i++ ) {
    if ( a[ i ] > a[ i + 1 ] ) {
      int const temp = a[ i ];

      a[ i ] = a[ i + 1 ];
      a[ i + 1 ] = temp;

      swapped = true;
    }
  }
} while ( swapped == true );

答案 4 :(得分:0)

for(i=0;i<n;i++)
{
  for(j=0;j<n;j++)
  {
   if (j != i){
    if(a[i]>a[j])
    {
      p=a[j];
      a[j]=a[i];
      a[i]=p;
    }
   }
  }

答案 5 :(得分:0)

如果你熟悉递归的概念,那么我会建议你使用quicksort算法,这是它的工作原理:

int qsort(int arr[] ,int lenght)
{
        int pivot , i = 0 , l = lenght - 1;
        const int MIN = 0 , MAX = l;
        if(lenght < 2)
                return;
        srand(time(NULL));
        pivot = arr[(rand() % (MAX - MIN + 1)) + MIN];
        while(i < l)
        {
                while(arr[i] < pivot)
                        i++;
                while(arr[l] > pivot)
                        l--;
                swap(arr , i , l);
        }
        qsort(arr , i);
        qsort(&arr[i + 1] , lenght - 1 - i);
}       
int swap(int arr[] , int elem1 , int elem2)
{
        int temp;
        temp = arr[elem1];
        arr[elem1] = arr[elem2];
        arr[elem2] = temp;
}

但要小心,因为这只有在给定数组的每个元素都是唯一的情况下才有效。

答案 6 :(得分:0)

只是在您的代码中进行纠正!

根据比较条件(a[i] > a[j]),如果内循环的j索引元素小于数组中外循环的i索引元素,则代码执行交换。然后你从j = 1开始你的内循环,这样它就不会检查并短接0 th 索引元素所以a[0]仍未排序。

  if(a[i] > a[j])

  when i = 0           

  if(a[0] > a[j]) == never true as a[0] is smallest element and j start with 1

您只需从j = 0启动内循环即可使其正常工作。

 for(j = 0; j < n; j++)
  //     ^ its 0 not 1  

此处您的代码正常运行:@ codepade

当您从j = 0开始

时,

注意

  if(a[i] > a[0]) becomes true when i > 0 

答案 7 :(得分:0)

切换到初始化ji+1足以修复程序。此外,编写的代码将按升序排序,而不是降序顺序。

代码正在尝试执行selection sort。这里的工作原理是我们从数组中选择最小元素,将其放在0时隙中,然后选择余数的最小值。实现的算法是从整个列表中选择最小值,这意味着已经正确放置的元素将被删除并放回错误的位置。