#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。
答案 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)
切换到初始化j
到i+1
足以修复程序。此外,编写的代码将按升序排序,而不是降序顺序。
代码正在尝试执行selection sort。这里的工作原理是我们从数组中选择最小元素,将其放在0
时隙中,然后选择余数的最小值。实现的算法是从整个列表中选择最小值,这意味着已经正确放置的元素将被删除并放回错误的位置。