选择排序讲解

选择排序讲解

#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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值