【问题标题】:Why this Selection Sort code not giving correct output? [closed]为什么这个选择排序代码没有给出正确的输出? [关闭]
【发布时间】:2017-08-16 10:03:43
【问题描述】:

当我运行代码时,我得到了结果7215,这显然是不正确的。代码很好,终端没有错误,只有输出错误。请帮助我知道这是一个基本的排序算法,但我是编程新手。

#include<stdio.h>
#include<stdlib.h>
void sort(int arr[],int n);
int main()
{
   int a[]={2,7,1,5};
   sort(a,4);
   return 0;
}

void sort(int arr[],int n)
{
   int i,j,temp;
   int imin;
   for(int i=0;i<(n-2);i++)
   {
      imin=i;
      for(int j=0;j<n;j++)
      {
         if(arr[j]<arr[imin])
         {
            imin=j;
         }
      }
      temp=arr[i];
      arr[i]=arr[imin];
      arr[imin]=temp;
   }
   int k;
   for(k=0;k<n;k++)
   {
      printf("\n%d\n",arr[k]);
   }
}

【问题讨论】:

  • 代码怎么可以同时好和错?
  • @FelixPalmen:我想它是“很好”的,因为它可以编译和运行而不会崩溃。

标签: c algorithm sorting


【解决方案1】:

这里有两个错误:

for(int i=0;i<(n-2);i++)

为什么是-2?你错过了以这种方式比较最后一个元素,应该是-1。括号是不必要的,但添加一些空格以使其可读:

for (int i = 0; i < n-1; i++)

那么,下一个循环也是错误的:

for(int j=0;j<n;j++)

再次从 0 开始,您将与已经排序的内容进行比较并销毁它。改成这样:

for (int j = i+1; j < n; j++)

对于这样的问题,你真的应该阅读How to debug small programs。橡皮鸭会帮助你的。

【讨论】:

  • thnx 先生,我明白了你所说的。现在代码工作正常 :)
【解决方案2】:

你犯了一些愚蠢的错误,选择排序算法是这样工作的::

选择排序算法通过从未排序的部分重复找到最小元素(考虑升序)并将其放在开头来对数组进行排序。该算法在给定数组中维护两个子数组。

1) 已经排序的子数组。 2) 剩余未排序的子数组。

在选择排序的每次迭代中,从未排序的子数组中挑选出最小的元素(考虑升序)并将其移动到已排序的子数组中。

arr[] = 64 25 12 22 11

// 查找 arr[0...4] 中的最小元素 // 并将其放在开头 11 25 12 22 64

// 查找 arr[1...4] 中的最小元素 // 并将其放在 arr[1...4] 的开头 11 12 25 22 64

// 查找 arr[2...4] 中的最小元素 // 并将其放在 arr[2...4] 的开头 11 12 22 25 64

// 查找 arr[3...4] 中的最小元素 // 并将其放在 arr[3...4] 的开头 11 12 22 25 64

所以你的代码应该是这样的:::

#include<stdio.h>
#include<stdlib.h>
void sort(int arr[],int n);
int main()
{
   int a[]={2,7,1,5};
   sort(a,4);
   return 0;
}

void sort(int arr[],int n)
{
   int i,j,temp;
   int imin;
   for(int i=0;i<(n-1);i++)
   {
      imin=i;
      for(int j=i+1;j<n;j++)
      {
         if(arr[j]<arr[imin])
         {
            imin=j;
         }
      }
      temp=arr[i];
      arr[i]=arr[imin];
      arr[imin]=temp;

   }
   int k;
   for(k=0;k<n;k++)
   {
      printf("\n%d\n",arr[k]);
   }
}

【讨论】:

  • 那里有很多工作,留着simple
  • 嗯,不确定解释算法是否必要,但也许它可以帮助某人。不过,您应该修复答案的格式以使其更具可读性。
猜你喜欢
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 2023-02-05
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多