第2章数据排序(C++版).ppt
《第2章数据排序(C++版).ppt》由会员分享,可在线阅读,更多相关《第2章数据排序(C++版).ppt(27页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第二章第二章 数据排序数据排序 信息获取后通常需要进行处理,处理后的信息其目的是便于人们的应用。信息处理方法有多种,通常有数据的排序,查找,插入,删除,归并等操作。读者已经接触了一些这方面的知识,本章重点介绍数据排序的几种方法。1. 选择排序选择排序(1) 基本思想:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在待排序的数列的最前,直到全部待排序的数据元素排完。(2)排序过程:【示例】:初 始 关键字 49 38 65 97 76 13 27 49第一趟排序后 1338 65 97 76 49 27 49第二趟排序后 13 2765 97 76 49 38 49第三趟排序后
2、13 27 38 97 76 49 65 49第四趟排序后 13 27 38 49 76 97 65 49第五趟排序后 13 27 38 49 49 97 65 76第六趟排序后 13 27 38 49 49 65 97 76第七趟排序后 13 27 38 49 49 65 76 97最后排序结果 13 27 38 49 49 65 76 97 void SelectSort(int R) /对R1.N进行直接选择排序 for (int i=1;i=n-1;i+) /做N - 1趟选择排序 K = I; For (int j=i+1;j=n;j+) /在当前无序区RI.N中选最小的元素RK I
3、f (RJ RK) K = J; If (K!=I) /交换RI和RK Temp = RI; RI = RK; RK = Temp; /SelectSort2.冒泡排序冒泡排序(1)基本的冒泡排序 基本思想依次比较相邻的两个数,把大的放前面,小的放后面。即首先比较第1个数和第2个数,大数放前,小数放后。然后比较第2个数和第3个数.直到比较最后两个数。第一趟结束,最小的一定沉到最后。重复上过程,仍从第1个数开始,到最后第2个数,然后.由于在排序过程中总是大数往前,小数往后,相当气泡上升,所以叫冒泡排序。下面是6个元素的排序的过程 4 5 7 1 2 3 5 4 7 1 2 3 5 7 4 1 2
4、 3 5 7 4 1 2 3 5 7 4 2 1 3 第一趟结束第一趟结束 5 7 4 2 3 7 5 4 2 3 1 7 5 4 2 3 1 7 5 4 2 3 1 第二趟结束第二趟结束 7 5 4 3 1 7 5 4 3 2 1 7 5 4 3 2 1 第三趟结束第三趟结束 7 5 4 2 1 7 5 4 3 2 1 第四趟结束第四趟结束 7 5 3 2 1 第五趟结束第五趟结束 4 3 2 1算法实现算法实现 for (int i=1;i=n-1;i+) for (int j=1;j=n-i;j+) if (ajaj+1) temp=aj; aj=aj+1; aj+1=temp; (2)
5、改进)改进 上例中,可以发现,第二趟结束已经排好序。但是计算机此时并不知道已经排好序。上例中,可以发现,第二趟结束已经排好序。但是计算机此时并不知道已经排好序。所以,还需进行一次比较,如果没有发生任何数据交换,则知道已经排好序,可以不干所以,还需进行一次比较,如果没有发生任何数据交换,则知道已经排好序,可以不干了。因此第三趟比较还需进行,第四趟、第五趟比较则不必要。了。因此第三趟比较还需进行,第四趟、第五趟比较则不必要。 我们设置一个布尔变量我们设置一个布尔变量bo 来记录是否有进行交换。值为来记录是否有进行交换。值为false表示本趟中进行了交换,表示本趟中进行了交换,true 则没有。代码
6、如下则没有。代码如下:Int i=1; do bo=true; for (int j=1;j=n-I;j+) if (ajaj+1) temp=aj; aj=aj+1; aj+1=temp; bo=false; I+;While (!bo);3. 桶排序 桶排序的思想是若待排序的记录的关键字在一个明显有限范围内(整型)时,可设计有限个有序桶,每个桶装入一个值(当然也可以装入若干个值),顺序输出各桶的值,将得到有序的序列。例:输入n个0到100之间的不相同整数,由小到大排序输出。#include#include using namespace std;Int main() int b101,k,
7、I,n; memset(b,0,sizeof(b); /初始化 cinn; for( i=1;Ik; bk+; /将关键字等于k的值全部装入第k桶 for( i=0; I0) couti ;bi-; /输出排序结果 coutendl;4. 插入排序插入排序 插入排序是一种简单的排序方法,其算法的基本思想是: 假设待排序的数据存放在数组R1.n中,增加一个哨兵结点x。(1) R1自成1个有序区,无序区为R2.n;(2) 从i=2起直至i=n为止,将Ri放在恰当的位置,使R1.i数据序列有序; x:=Ri; 将x与前i-1个数比较 , j:=i-1; while xaj do j:=j-1; 将R
8、数组的元素从j位置开始向后移动: for k:=i downto j do ak:=ak-1; Rj=x;(3) 生成包含n个数据的有序区。. 例如:设n=8,数组R中8个元素是: 36,25,48,12,65,43,20,58,执行插入排序程序后,其数据变动情况:第0步:36 25 48 12 65 43 20 58第1步:25 36 48 12 65 43 20 58第2步:25 36 48 12 65 43 20 58第3步:12 25 36 48 65 43 20 58第4步:12 25 36 48 65 43 20 58第5步:12 25 36 43 48 65 20 58第6步:1
9、2 20 25 36 43 48 65 58第7步:12 20 25 36 43 48 58 65该算法的程序简单,读者自己完成。其算法的时间复杂性为该算法的程序简单,读者自己完成。其算法的时间复杂性为O(n2)插入排序适插入排序适用于原先数据已经排列好,插入一个新数据的情况。用于原先数据已经排列好,插入一个新数据的情况。void insertsort(int r) /对r1.n按递增序进行插入排序,x是监视哨 for (i=2;i=n;i+) /依次插入r2,.,rn x=ri; j= i-1; While (xj为止。 快速排序的时间的复杂性是O(nlog2n),速度快,但它是不稳定的排序
10、方法。就平均时间而言,快速排序是目前被认为是最好的一种内部排序方法 由以上讨论可知,从时间上看,快速排序的平均性能优于前面讨论过的各种排序方法,但快速排序需一个栈空间来实现递归。若每一趟排序都将记录序列均匀地分割成长度相接近的两个子序列,则栈的最大深度为log(n+1)。快速排序算法快速排序算法void qsort(int l,int r) int i,j,mid,p; i=l; j=r; mid=a(l+r) / 2; /将当前序列在中间位置的数定义为分隔数 do while (aimid) j-; /在右半部分寻找比中间数小的数 if (i=j) /若找到一组与排序目标不一致的数对则交换它
11、们 p=ai; ai=aj; aj=p; i+; j-; /继续找 while (i=j); /注意这里不能有等号 if (lj) qsort(l,j); /若未到两个数的边界,则递归搜索左右区间 if (ir) qsort(i,r);end;6.归并排序归并排序 将两个或两个以上有序的数列(或有序表),合并成一个仍然有序的数列(有序表),这种操作称为归并操作。这样的方法经常用于多个有序的数据文件归并成一个有序的数据文件。若将两个有序表合并成一个有序表则称为二路归并,同理,有三路归并、四路归并等。二路归并比较简单,所以我们只讨论二路归并。例如有两个有序表: (7,10,13,15)和(4,8,
12、19,20),归并后得到的有序表为: (4,7,8,10,13,15,19,20)。 归并过程为:比较Ai和Aj的大小,若AiAj,则将第一个有序表中的元素Ai复制到Rk中,并令i和k分别加1,即使之分别指问后一单元,否则将第二个有序表中的元素Aj复制到Rk中,并令j和k分别加1;如此循环下去,直到其中的一个有序表取完,然后再将另一个有序表中剩余的元素复制到R中从下标k到下标t的单元.二路归并算法描述为二路归并算法描述为(As,t中的数据由小到大合并到中的数据由小到大合并到Rs,t中中):void merge(int s, int m,int t) /两个有序表As,m和Am+1,t合并成一个
13、有序表Rs,t /s是第一个有序表起点位置,m+1是第二个有序表的起点 i=s; j=m+1; k=s; /i和j分别指向二个有序表的头部 while (i=m&j=t) if (Ai =Aj ) Rk=Ai; i+; k+; else Rk=Aj; j+; k+; while (i=m) Rk=Ai; i+; k+; /复制第一路剩余 while ( j=t) Rk=Aj; j+; k+; /复制第二路剩余 归并排序(Merge sort)就是利用归并操作把一个无序表排列成一个有序表的过程。二路归并排序的过程是首先把待排序区间(即无序表)中的每一个元素都看作为一个有序表,则n个元素构成n个有
14、序表,接着两两归并(即第一个表同第二个表归并,第三个表同第四个表归并,),得到n/2个长度为2的有序表(最后一个表的长度可能小于2),称此为一趟归并,然后再两两有序表归并,得到n/2/2个长度为4的有序表(最后一个表的长度可能小于4),如此进行下去,直到归并第log2n趟后得到一个长度为n的有序表为止。 归并排序算法我们用递归实现,先把待排序区间s,t以中点二分,接着把左边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并成有序的区间s,t。对左右子区间的排序与原问题一样,所以我们可以调用同样的子程序,只是区间大小不一样。归并排序程序如下:归并排序程序如下:program
15、ex_2;#includeUsing namespace std;int a10001,r10001,n,i;/a是待排序数组,是待排序数组,r是临时数组是临时数组void mergesort(int s,int t) /对对s,t区间的无序数据进行归并排序区间的无序数据进行归并排序 int m,I,j,k; if (s=t) return; /若区间只有一个数据就不用排了若区间只有一个数据就不用排了 m = (s+t) / 2; /取区间的中点取区间的中点 mergesort(s,m); /以中点二分,对左边了区间进行排序以中点二分,对左边了区间进行排序 mergesort(m+1,t);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据 排序 C+
限制150内