我的老婆是鬼王刘阳:读程题一道

来源:百度文库 编辑:神马品牌网 时间:2024/04/30 06:42:53
用选择法对数组中10个整数按由小到大排序.所谓选择法是先将10个数中最小的数与a[0]对换;再将a[1]到a[9]中最小的数与a[1]对换......每比较一轮,找出一个未经排序的数中最小的一个.共比较9轮.

void sort(int array[],int n)
{int i,j,k,t;
for(i=0;i<n-1;i++)
{k=i;
for(j=i+1;j<n;j++)
if(array[j]<array[k]) k=j;
t=array[k];array[k]=array[i];array[i]=t;}
}
main()
{int a[10],i;
printf("enter the array\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
sort(a,10);
print("the sorted array: \n");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
}

我的问题是

for(j=i+1;j<n;j++)
if(array[j]<array[k]) k=j;
t=array[k];array[k]=array[i];array[i]=t;

这几条语句实现的是什么?
我看不太懂
我觉得这不是实现选择法排序
意思好象是数组中的两个元素比较array[k]比array[j]大的话就交换,这并不是将最小的数和a[0]对换啊

恕本人资质愚钝
谢谢大家了

for(i=0;i<n-1;i++)
{k=i;
由于这两句所以k第一次循环就是a[0],接着第二次循环就是a[1].....
而j是a[0]之后所有的数分别去比较,每次比较都会确定k是否是最小如果是就检查下一个否则对调。

像排序方法有许多种,这种是“直接选择排序”

1、 基本思想:
首先在所有记录中选出关键字值最小的记录,把它与第一个记录进行位置交换,然后在其余的记录中再选出关键字值次小的记录与第二个记录进行位置交换,依此类推,直到所有记录排好序。
2、 基本步骤:
(1) 置i为1。
(2) 当i<n,重复下列步骤:
.在(R[i],…,R[n])中选出一个关键字值最小的记录R[k],若R[k]不是R[i],(即k!=i),交换R[i],R[k]的位置,否则不进行交换。
.i值加1。
3、 算法如下:
void selectsort(sqlist &L)
{ for(i=1;i<=L.length-1;++i) //选择第i小的记录,并交换到位
{ k=i;
for(j=i+1;j<=L.length;++j) //在L.r[j..L.length]中选择key最小的记录
if (L.r[j].key<L.r[k].key)
k=j;
if (k!=i)
{ temp=L.r[i]; L.r[i]=L.r[k]; L.r[k]=temp;} //与第i个记录交换
} }
4.算法分析:
时间复杂度 空间复杂度 稳定性
O(n2) O(1) 不稳定

这是数据结构中对他的分析,其他的排序方法你可以看看数据结构的相关书籍会有很好的介绍。