1
      #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。

4

8 回答 8

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]);
}
于 2013-08-15T21:11:34.390 回答
1

只需按如下方式更改您的内部“for”循环:

      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;
        }

这允许您根据需要遍历整个数组“n”次,以将两个连续数组元素之间的较大数字降低 1,直到对整个列表进行排序。因此,使用 n = 5 的 1, 2, 3, 4 ,5 示例,执行内部 for 循环后数组的“快照”为 [51234]、[54123]、[54312]、[54321]此时 i=4 所以 for 循环测试失败并且您的数组已排序。. . 希望这可以帮助

于 2013-08-15T22:05:28.473 回答
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;
    }
   }
  }
于 2013-08-15T21:12:16.343 回答
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 );
于 2013-08-15T21:04:05.017 回答
0

如果您熟悉递归的概念,那么我会向您推荐快速排序算法,它的工作原理如下:

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;
}

但要小心,因为这只适用于给定数组的每个元素都是唯一的。

于 2013-08-15T21:14:30.430 回答
0

只是对您的代码进行更正!

根据比较条件,如果内部循环的索引元素小于数组中外部循环的索引元素,则(a[i] > a[j])您的代码将执行交换。然后你开始你的内部循环,所以它不会检查和缩短第 0索引元素所以保持未排序。jij = 1a[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 = 0then开始

  if(a[i] > a[0]) becomes true when i > 0 
于 2013-08-15T21:14:55.300 回答
0

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

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

于 2013-08-15T22:06:28.387 回答
0

我建议您在 Internet 上查找冒泡排序算法。

在这里:

    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以便对所有元素进行排序。

于 2013-08-15T21:03:22.557 回答