华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1308|回复: 1
打印 上一主题 下一主题

选择排序

[复制链接]

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
跳转到指定楼层
楼主
发表于 2020-7-16 11:07:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
输入10个正整数,把它按由大到小的顺序排列,然后输出。
这是NOIP中一种常见的操作,排序,这里给大家介绍一个很容易理解的排序方法--选择排序:
假设10个数分别是7,5,6,4,8,2,3,5,9,1
1、找到a1-a10中的最大数,是第九个,9,把它和a1交换,得到9,5,6,4,8,2,3,5,7,1
2、找到a2-a10中的最大数,是第五个,8,把它和a2交换,得到9,8,6,4,5,2,3,5,7,1
3、***
也就是说做9次:每次找到ai到a10的最大数,把它和ai交换。

找到ai到a10的最大数的位置:
  1. maxa=a[i],maxi=i;
  2. for (j=i+1;j<=10;j++)
  3.    if (a[j]>maxa) { maxa=a[j],maxi=j;}
复制代码


交换a(i)和a(maxi),可以swap(ai,amaxi)

把这个做9次,在最外层套一个循环 for (i=1;i<=9;i++)

最后的程序如下:

  1. for (int i=1; i<=9; i++)
  2.                 {
  3.                         maxa=a[i],maxi=i;  ///假定我最大

  4.                         for (j=i+1; j<=10; j++)  ///找最大标准程序
  5.                                 if (a[j]>maxa)
  6.                                         {
  7.                                                 maxa=a[j],maxi=j;
  8.                                         }
  9.                         swap(a[i],a[maxi]);///交换
  10.                 }
  11.         for (i=1; i<10; i++) cout<<a[i]<<' '; ///输出
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-12-26 13:50 , Processed in 0.096760 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表