选择排序讲解
#i nclude
void main(){
void sort(int x[],int n);
int *p,i,a[10];
p=a;
for(i=0;i<10;i++)scanf("%d",p++);
p=a;
sort(p,10);
for(p=a,i=0;i<10;i++){
printf("%5d",*p);
p++;
}
}
void sort(int x[],int n){
int i,j,k,t;
for(i=0;i
k=i;
for(j=i+1;j
if(x[j]>x[k])k=j;
if(k!=i){
t=x[i];
x[i]=x[k];
x[k]=t;
}
}
}
//Li同学发送给我的源程序有若干笔误,已修改
在mail中该同学提到:
这个是课本指针那一章的,是用选择法对10个数从大到小排序的.我看不懂后面的那个被调函数尤其是那个if(k!=i),这个条件不是必然成立的吗?老师具体给我说下这个程序吧.
下面专门讲解一下这个程序。
选择排序方法是基本的排序算法之一。其算法思路简单,容易构建,缺点是执行效率不如冒泡法、希尔排序法等。
选择排序法的核心思想是从待排序数据序列中选择最大(小)的那个,将其放在最前。比如对于10个数据(编号为array[0]-array[9]),如下:
12 56 -9 456 69 321 -987 52 63 10
首先从array[0]-array[9]中选择最大的那个,将其放在array[0]。
其次从array[1]-array[9]中选择最大的那个,将其放在array[1]。
再次从array[2]-array[9]中选择最大的那个,将其放在array[2]。
……
最后从array[8]-array[9] 中选择最大的那个,将其放在array[8]。
很显然,经过9轮选择,整个数组就会按降序排列,这就是选择排序法的算法流程。
这需要用一个二重循环来实现。内层循环的本质是寻找特定范围数据的最大者,并将其放在约定位置。
将该算法以更一般的形式描述:
有n个数组元素需要从大到小排序(编号为array[0]-array[n-1])。则需要n-1轮选择。
首先从array[0]-array[n-1]中选择最大的那个,将其放在array[0]。
其次从array[1]-array[n-1]中选择最大的那个,将其放在array[1]。
再次从array[2]-array[n-1]中选择最大的那个,将其放在array[2]。
……
最后从array[n-2]-array[n-1]中选择最大的那个,将其放在array[8]。
可以看出,这n-1次循环的规律是一样的。选择排序算法可以描述为:
void sort(int array[],int n){
int i;
for(i=0;i<=n-2;i++)
{从array[i]-array[n-2]中选择最大的放在array[i];}
}
那么下面的任务就是实现{从array[i]-array[n-2]中选择最大的放在array[i];}了。略。
注释讲解如下:
///
#i nclude
void main(){
void sort(int x[],int n);
int *p,i,a[10];//主函数中声明指针变量p,循环变量i,数组a
p=a;//p指向a的首地址即a[0]
for(i=0;i<10;i++)scanf("%d",p++);//通过指针p间接访问数组元素,接受值放在数组中
p=a;//重新使指针变量指向数组首地址,非常重要
sort(p,10);//调用选择法排序函数sort(int*,int)
for(p=a,i=0;i<10;i++){//该for循环用来打印已排序的数组元素,p=a没有必要
printf("%5d",*p);
p++;
}
}
void sort(int x[],int n){
int i,j,k,t;//k用来指向最大的元素
for(i=0;i//n个数组元素,i=0~n-2,做n-1轮,在x[i]-x[n-2]中选择最大的放在x[i];
k=i;//默认x[i]为最大,k指向x[i]
for(j=i+1;j
if(x[j]>x[k])k=j;//若有元素大于x[k],则更新k,使k始终指向最大的元素
if(k!=i){//k最初指向i,若k值没有变化(k==i),说明x[i]就是x[i]-x[n-2]中的最大值,不用再交换;若k!=i,说明k值有更新就不再等于i,需要将x[k]即最大值交换到x[i])
t=x[i];
x[i]=x[k];
x[k]=t;
}
}
}
/
至于Li同学所说“k!=i必然成立”是不正确的。k==i是有可能的,如array[i]-array[n-1]的最大值恰好是array[i],则k==i。这时候就不必要(而非不能)交换,因为array[k]就是array[i]。
sort函数执行实例:
对28 356 53 -9 93 815 -815 8 9 15降序排列(array[0]-array[9])。
//第一轮(i==0),从array[i]-array[9]中选择最大的,放在a[i]
i==0,k==5,array[i]<==>array[k]
第一轮过后:
815 356 53 -9 93 28 -815 8 9 15
//第二轮(i==1),从array[i]-array[9]中选择最大的,放在a[i]
i==1,k==1,不必交换
第二轮过后:
815 356 53 -9 93 28 -815 8 9 15
//第三轮(i==2),从array[i]-array[9]中选择最大的,放在a[i]
i==2,k==4,array[i]<==>array[k]
第三轮过后:
815 356 93 -9 53 28 -815 8 9 15
//第四轮(i==3),从array[i]-array[9]中选择最大的,放在a[i]
i==3,k==4,array[i]<==>array[k]
第四轮过后:
815 356 93 53 -9 28 -815 8 9 15
//第五轮(i==4),从array[i]-array[9]中选择最大的,放在a[i]
i==4,k==5,array[i]<==>array[k]
第五轮过后:
815 356 93 53 28 -9 -815 8 9 15
//第六轮(i==5),从array[i]-array[9]中选择最大的,放在a[i]
i==5,k==9,array[i]<==>array[k]
第六轮过后:
815 356 93 53 28 15 -815 8 9 -9
//第七轮(i==6),从array[i]-array[9]中选择最大的,放在a[i]
i==6,k==8,array[i]<==>array[k]
第七轮过后:
815 356 93 53 28 15 9 8 -815 -9
//第八轮(i==7),从array[i]-array[9]中选择最大的,放在a[i]
i==7,k==7,不必交换
第八轮过后:
815 356 93 53 28 15 9 8 -815 -9
//第九轮(i==8),从array[i]-array[9]中选择最大的,放在a[i]
i==8,k==9, array[i]<==>array[k]
第九轮过后:
815 356 93 53 28 15 9 8 -9 -815
/完成
[@more@]来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7271077/viewspace-909181/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/7271077/viewspace-909181/