排序算法.ppt
《排序算法.ppt》由会员分享,可在线阅读,更多相关《排序算法.ppt(19页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、排序算法专题排序算法专题 甘肃省白银市平川区第三中学甘肃省白银市平川区第三中学 张民辉张民辉主要内容主要内容:一、选择排序一、选择排序二、插入排序二、插入排序三、冒泡排序三、冒泡排序四、合并排序四、合并排序五、快速排序五、快速排序七、计数排序七、计数排序六、桶排序六、桶排序其它的排序:其它的排序:堆排序,留在后面介绍堆排序,留在后面介绍 排序就是把一组无序的关键字,通过算法变成一组有序的排序就是把一组无序的关键字,通过算法变成一组有序的关键字。关键字。一、选择排序一、选择排序算法思想:对于一组关键字K1,K2,Kn,首先从K1,K2,Kn中选择最小值,假如它是Ki,则将Ki与K1对换,然后从K
2、2,K3,Kn中选择最小值Ki,再将Ki与K2对换. 如此进行选择和调换n-2趟,第(n-1)趟,从Kn-1、Kn中选择最小值Ki将Ki与Kn-1对换,最后剩下的就是该序列中的最大值,一个由小到大的有序序列就这样形成. 即: 在要排序的一组数中,选出最小的一个数与第一个位置的数交换,然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。举例:对下面一组关键字,要求按照从大到小排序 a1 a2 a3 a4 a5 a6 a7 1 3 2 8 7 4 99 1 2 3 7 4 8从A1到a7找最大的数9 8 1 2 3 4 7从A2到a7找最大的数9 8 7
3、1 2 3 4从A3到a7找最大的数9 8 7 4 1 2 3从A4到a7找最大的数9 8 7 4 3 1 2从A5到a7找最大的数9 8 7 4 3 2 1从A6到a7找最大的数9 8 7 4 3 2 1排序结束 for(i=1;in;i+) for(j=i+1;jai) a0=ai; ai=aj; aj=a0; 核心代码核心代码该算法缺点就是元素交换的次数太多。改进算法: for(i=1;i=n;i+) k=i; for(j=i+1;j=n;j+) if(akaj) k=j; if(k!=i) a0=ai; ai=ak; ak=a0; 二、插入排序二、插入排序算法思想:设有一组关键字K1,
4、K2,Kn,排序开始就认为K1是一个有序序列,让K2 插入上述表长为1的有序序列,使之成为一个表长为2的有序序列,然后让K3插入上述表长为2的有序序列,使之成为一个表长为3的有序序列,依次类推,最后让Kn插入上述表长为 n-1的有序序列,得一个表长为n的有序序列。 第一趟: 55 22 44 11 33第二趟: 22 55 44 11 33第三趟: 22 44 55 11 33第四趟: 11 22 44 55 33第五趟: 11 22 33 44 55 解决问题关键是找插入的位解决问题关键是找插入的位置。需要写一个函数置。需要写一个函数find(x,y),来确定第来确定第y个插入元素个插入元素
5、x在已经在已经有序的序列中的位置。有序的序列中的位置。int find(int x,int y)/该函数就是确定第y个元素x,在有序序列中的位置。 int k=y;/函数值通过K来返回,K初始化为y,设插入在y位置。 for(int i=1;i=x) k=i;break;/记下第一个比X小的数的位置,退出循环 return k;/此时的k即为X要插入的位置。 程序核心代码:程序核心代码: for(int i=1;im; k=find(m,i); for (int j=i;j=k;j-) aj+1=aj; ak=m; 程序采用了边读入边插入的方法。兰色部分为后面元素后移。三、冒泡排序三、冒泡排序
6、算法思想:(1)让j取1至n-1,将rj与rj+1比较,如果rjrj+1,则把记录rj与rj+1交换位置,否则不进行交换. 最后是rn-1与rn比较,关键字较小的记录就换到rn的位置上,到此第一趟冒泡结束。最小关键字的记录就象最轻的气泡冒到顶部一样换到了文件的最后.(2) 让j取1至n-2,重复上述的比较对换操作,最终rn-1之中存放的是剩余n-1个记录(rn除外)中关键字最小的记录.(3) 让j取1至2,经过一系列对联对比交换之后,r3之中是剩余若干记录中关键字最小的记录.(4) 让j取1至1,将r1 与r2对比,把关键字较小的记录交换到r2之中。至此,经过n-1次冒泡,r1到rn中的数就成
7、了有序的数。举例:对下面一组关键字,要求按照从大到小排序 a1 a2 a3 a4 a5 a6 a7 1 3 2 8 7 4 93 2 8 7 4 9 13 8 7 4 9 2 1第一趟第二趟第三趟第四趟第五趟第六趟排序结束8 7 4 9 3 2 18 7 9 4 3 2 18 9 7 4 3 2 19 8 7 4 3 2 19 8 7 4 3 2 1for(int i=1;in;i+) for(int j=1;j=n-i;j+) if(ajaj+1) int tmp=aj+1;aj+1=aj;aj=tmp; 核心代码:核心代码:优化:优化:如果待排序是下面这样的数据。很显然除了第一趟排序在最后
8、如果待排序是下面这样的数据。很显然除了第一趟排序在最后一次比较发生了交换外,以后每一趟都不会发生交换。排序在第一趟冒一次比较发生了交换外,以后每一趟都不会发生交换。排序在第一趟冒泡后就已经有序了,可以结束了。泡后就已经有序了,可以结束了。5 4 3 1 2for(int i=1;in;i+) bool flag=true;/引入了一个标记变量引入了一个标记变量flag,循环中交换过就改变值循环中交换过就改变值 for(int j=1;jaj+1) int tmp=aj+1;aj+1=aj;aj=tmp;flag=false;/ if (flag) break;/flag的值没改变过,说明没发生
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 排序 算法
限制150内