你能否告诉我为什么我总是只按降序排列a[i]
数组?请帮忙。
for(i=0;i<10;i++)
{
for (j=0;j<10;j++)
{
if(a[i]>=a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
答案 0 :(得分:9)
问题是你的排序会运行两个完整的循环,比较所有a
和i
对的j
,包括i
更大的j
而不是for(i=0;i<10-1;i++) // You do not need to touch the last element, so end at 10-1
{
for (j=i+1;j<10;j++) // Make it j = i+1
{
if(a[i] > a[j]) // >, not >= : no need to swap when two items are equal
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
(此时您不应该交换项目)。为了使选择排序 * 起作用,它只需要从数组的未排序部分中选择其交换候选项。
以下是修复实施的方法:
{{1}}
* Selection Sort是您正在实施的排序算法的奇特名称。
答案 1 :(得分:3)
你能否告诉我为什么我总是只按降序排列
a[i]
数组?
因为您按降序实现了逻辑(比较)。改变
if(a[i]>=a[j])
到
if(a[i] < a[j])
参见代码:
#include <stdio.h>
int main()
{
int a[10] = {3,15,9,4,15,65,0,2,1,1};
int temp;
for(int i=0;i<10;i++)
{
for (int j=0;j<10;j++)
{
if(a[j] > a[i])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
for(int i=0;i<10;i++)
printf("%d ", a[i]);
}
以下是输出的工作代码:http://ideone.com/DijpJD。
排序过程的步骤:仅显示发生更改的步骤。
Pass 1: 15 3 9 4 15 65 0 2 1 1
65 3 9 4 15 15 0 2 1 1
Pass 2: 3 65 9 4 15 15 0 2 1 1
Pass 3: 3 9 65 4 15 15 0 2 1 1
Pass 4: 3 4 65 9 15 15 0 2 1 1
3 4 9 65 15 15 0 2 1 1
Pass 5: 3 4 9 15 65 15 0 2 1 1
Pass 6: 3 4 9 15 15 65 0 2 1 1
Pass 7: 0 4 9 15 15 65 3 2 1 1
0 3 9 15 15 65 4 2 1 1
0 3 4 15 15 65 9 2 1 1
0 3 4 9 15 65 15 2 1 1
0 3 4 9 15 15 65 2 1 1
Pass 8: 0 2 4 9 15 15 65 3 1 1
0 2 3 9 15 15 65 4 1 1
0 2 3 4 15 15 65 9 1 1
0 2 3 4 9 15 65 15 1 1
0 2 3 4 9 15 15 65 1 1
Pass 9: 0 1 3 4 9 15 15 65 2 1
0 1 2 4 9 15 15 65 3 1
0 1 2 3 9 15 15 65 4 1
0 1 2 3 4 15 15 65 9 1
0 1 2 3 4 9 15 65 15 1
0 1 2 3 4 9 15 15 65 1
Pass 10: 0 1 1 3 4 9 15 15 65 2
0 1 1 2 4 9 15 15 65 3
0 1 1 2 3 9 15 15 65 4
0 1 1 2 3 4 15 15 65 9
0 1 1 2 3 4 9 15 65 15
0 1 1 2 3 4 9 15 15 65