C语言数组排序问题

来源:百度知道 编辑:UC知道 时间:2024/05/24 22:46:16
用选择法对数组中10个整数由小到大排序。
我写的程序:
#include <stdio.h>
void main()
{
void compare(int a[],int n);
int i,a[10];
for(i=0;i<10;i++)
scanf("%d",&a[i]);
compare(a,10);
for(i=0;i<=9;i++)
printf("%d ",a[i]);
}

void compare(int a[],int n)
{
int i,j,t;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
{
if(a[i]>a[j])
t=a[i];a[i]=a[j];a[j]=t;
}
}
但输入10个整数后会出现如下错误.
4 11 22 3 66 44 55 5 77 8
排序后出现 4 11 22 77 77 77 77 77 77 77
不知道是什么问题,请高手帮帮忙

书上是这样的:(只子函数不同)
void compare(int a[],int n)
{
int i,j,t,k;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(a[j]>a[k])
k=j;
t=a[k];a[k]=a[i];a[i]=t;
}
}
}

请看函数体那,
for(j=i+1;j<n;j++)
{
if(a[i]>a[j])
t=a[i];a[i]=a[j];a[j]=t;
}

if判断句只控制了 t=a[i] 语句,加个括号就可以了,
修改如下:

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

if(a[i]>a[j])
t=a[i];a[i]=a[j];a[j]=t;
}
你这里把两个数交换了,下次比较是a[i]就是a[j],但下标在原先的i那,而此时的a[i]下标应该在j那,所以书上的冒泡要用一个k来控制下标,使交换后的a[i]下标和其真实位置匹配