《排序》课件.ppt
第五章排序课程目标n何谓排序n交换式排序冒泡排序法快速排序法n选择式排序选择排序法n插入式排序插入排序法本章体验项目本程序启动后,进入到彩票机的界面,在界面的又上角有一组单选框,分别是手选和机选(默认)。如果是机选,则点击“开始”按钮生成一组1到30的随机数并显示在7个小文本框里(没有控制是否有重复数)。点击“排序”按钮将7个数进行排序后并显示在界面中间的文本域中。如果是手选,则自己在7个文本框中填写所喜欢的号码,然后点击“开始”按钮将7个号码排序后输出。“清除”按钮是将显示区域的数据清除,“退出”按钮是退出程序。5.1何谓排序5.1.1排序的意义所谓排序是将一组数据依照一定的顺序排列起来。最常见的排序是“从小到大”的“递增排序”和“从大到小”的“递减排序”。以下列数组为例进行说明递增排序:递增排序:递减排序:递减排序:5.1.2排序的特性稳定性稳定性 不稳定性不稳定性 排序过后能使值相同的数据保排序过后能使值相同的数据保持原顺序中的相对位置持原顺序中的相对位置 排序过后不能使值相同的数据排序过后不能使值相同的数据保持原顺序中的相对位置保持原顺序中的相对位置 例如:例如:稳定排序的结果:稳定排序的结果:不稳定排序的结果:不稳定排序的结果:排序后排序后7()仍旧在()仍旧在7()之前,二者相对位置不变()之前,二者相对位置不变 排序后排序后7()则在()则在7()之后,二者相对位置发生了改变()之后,二者相对位置发生了改变 5.1.2排序的分类排序的分类大致上可分为两种排序的分类大致上可分为两种 内部排序内部排序 外部排序外部排序 将欲处理的数据整个存放到内部存储器中将欲处理的数据整个存放到内部存储器中排序,数据可被随机存取排序,数据可被随机存取 交换式排序交换式排序 选择式排序选择式排序 插入式排序插入式排序 欲处理的数据两过于庞大,无法全部存放到内部存储欲处理的数据两过于庞大,无法全部存放到内部存储器,必须借助外部的辅助存储器(比如:硬盘),器,必须借助外部的辅助存储器(比如:硬盘),由于数据是存在外存中,故数据不可随机被存取由于数据是存在外存中,故数据不可随机被存取 合并排序法合并排序法 直接合并排序法直接合并排序法 在本书中只介绍内部在本书中只介绍内部排序法。排序法。以下所有排序均为从以下所有排序均为从小到大升序排列小到大升序排列 5.2交换式排序内部排序中的交换式排序,是运用数据值比较后,以判断规则对数据位置进行交换,已达到排序的目的。交换式排序法又可分为两种交换式排序法又可分为两种 冒泡排序法(冒泡排序法(Bubble Sort)快速排序法(快速排序法(Quick Sort)5.2.1冒泡排序法排序方法从数组第一个元素开始,将第一个元素ai同下一个元素ai+1进行比较,如果ai大于ai+1则将两者相交换。直到比较完最后一个元素。这时数组中最小的元素会被交换成为数组首端。由于该比较法每次可以将最大或者最小的元素以交换的方式移动到数组首或数组为,就像气泡从水底浮向水面一样,到水面时气泡最大,故称该排序法为冒泡排序法。举例说明如数组:inta=6,5,8,3,7;该数组中一共有该数组中一共有5个数据,所以要比较个数据,所以要比较4趟,每趟相互比较趟,每趟相互比较4次。次。第一趟:第一趟:(1)a0 VS a1,因为a0a1,所以交换a0和a1(2)a1 VS a2,因为a1a3,所以交换a2和a3。(4)a3 VS a4,因为a3a4,所以交换a3和a4。这样第一趟就比较完了,数组中最大的8也到了最后一位,成为第一个吐出的泡泡。按照这样的步骤继续循环直到所有元素都排序完成为止。publicclassBubbleSortpublicvoidbubbleSort(inta)intt=0;for(inti=0;ia.length-1;i+)for(intj=i+1;jaj)t=ai;ai=aj;aj=t;for(intk=0;ka.length;k+)System.out.print(ak+);System.out.println();System.out.println(-);打印每一趟打印每一趟排序的结果排序的结果进行比较,如果前面的进行比较,如果前面的元素比后面的大则交换元素比后面的大则交换冒泡排序的优点和缺点n优点:若数据已有部分排好序,则可以很快的完成排序。n缺点:会反复扫描数据,比较相邻的两个数据,速度不快也没有效率。冒泡排序属于稳定性排序法冒泡排序属于稳定性排序法 最佳状况:数据的顺序恰与排序后的顺序相同最佳状况:数据的顺序恰与排序后的顺序相同 最坏状况:数据的顺序恰与排序后的顺序相反最坏状况:数据的顺序恰与排序后的顺序相反 如:如:如:如:5.2.2快速排序法快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。分解:在未排序的数组中任选一个记录作为基准,将数组分为左右两个较小的子数组。左边的数组元素都小于基准,右边的数组元素都大于基准,而该基准则位于正确的位置上。然后将两个子数组再使用递归进行分解。这样不断的分解最后得到正确的排序。具体的算法:假设有n个数据a0an-1设立标志L=a0=m;指向第1个位置a0,i=0标志R=an-1;只想第n个位置an,j=n步骤1:L往右找,直到找到比L值大时停止,假设停止于aiR往左找,直到找到比R值小时停止,假设停止于aj此时可能有两种状况:如果(ij)那么将ai与aj的内容相交换如果(ij)那么将此数组的第一个元素m和aj相交换,交换后的m已经找到其所在的位置,并将数组切割成两部分,其左边数据均小于m,其有边数据均大于m。步骤2:每次被分割的分区再分别设立L及R标志,重复步骤1。直到所有分区排序完成。publicvoidquickSort(inta,intleft,intright,intindex)inti,j;intm,temp;i=left;j=right;m=aleft;dowhile(aim)&(im)&(jleft)j-;if(i=j)temp=ai;ai=aj;aj=temp;i+;j-;while(i=j);if(lefti)quickSort(a,i,right,index);如果两边扫描的下标交错,就停止(完成一次)如果两边扫描的下标交错,就停止(完成一次)将数组分段后递归调用自己再排序将数组分段后递归调用自己再排序直到找到比直到找到比m值大时停止值大时停止 直到找到比直到找到比m值小时停止值小时停止 该排序方法为不稳定排序,即排序后数值相同的元素之间相对位置会发生改变。此方法是所有排序方法中速度最快的。5.3选择式排序选择式排序可分为两种选择式排序可分为两种选择排序法选择排序法 堆排序法堆排序法 在本教材中只给大家介绍选择排序法,堆排序法如读者有兴趣请在本教材中只给大家介绍选择排序法,堆排序法如读者有兴趣请查阅其他相关书籍查阅其他相关书籍 5.3.1选择排序法选择排序法排序的方法是:先在n个元素中找出最小的元素。然后将此元素和数组第一个元素交换。再从剩下的(n-1)个元素中找出最小的和第二个元素交换。这样不断循环,直到所有元素均已排序完成,从而达到排序的目的。下面我们来看一个选择式排序的例子:publicvoidselectionSort(inta)inttemp;for(inti=0;ia.length;i+)intindex=getMinIndex(a,i);if(index!=i)temp=ai;ai=aindex;aindex=temp;for(inti=0;ia.length;i+)System.out.print(ai+);private int getMinIndex(int a,int begin)int min=abegin;int index=begin;for(int i=begin;ia.length;i+)if(aimin)min=ai;index=i;return index;得到最小元素的下标得到最小元素的下标 如果得到的不是第一个如果得到的不是第一个元的下标则交换元的下标则交换 从起始序号开从起始序号开始寻找最小元始寻找最小元素的下标素的下标 在每一次查找时返回的是最小元素的下标,请同学们一定要注意,不要返回数组的最小值。选择排序法算法简单,易懂,容易实现。该算法不适宜于n较大的情况。直接选择排序是不稳定的。插入式排序属于内部排序,是对于欲排序的元素以插入的方式寻找该元素的适当位置,以达到排序的目的。插入式排序又可分为插入式排序又可分为3种:种:插入排序法插入排序法 谢尔排序法谢尔排序法 二叉树排序法二叉树排序法 这里只给大家介绍插入排序法这里只给大家介绍插入排序法1排序思想假设待排序的记录存放在数组R1.n中。初始时,R1自成1个有序区,无序区为R2.n。从i=2起直至i=n为止,依次将Ri插入当前的有序区R1.i-1中,生成含n个记录的有序区。2第i-1趟直接插入排序:通常将一个记录Ri(i=2,3,n-1)插入到当前的有序区,使得插入后仍保证该区间里的记录是按关键字有序的操作称第i-1趟直接插入排序。排序过程的某一中间时刻,R被划分成两个子区间R1i-1(已排好序的有序区)和Rin(当前未排序的部分,可称无序区)。直接插入排序的基本操作是将当前无序区的第1个记录Ri插人到有序区R1i-1中适当的位置上,使R1i变为新的有序区。因为这种方法每次使有序区增加1个记录,通常称增量法。publicvoidinsertSort(inta)intinsertNode;inti,j,k;for(i=1;i=0&insertNodeaj)aj+1=aj;j-;aj+1=insertNode;System.out.print(正在排序:);for(k=0;ka.length;k+)System.out.print(ak+);System.out.println();寻找合适的空间来放置寻找合适的空间来放置当前要排序的元素当前要排序的元素 打印当前排序情况打印当前排序情况 直接插入排序是稳定的排序方法直接插入排序是稳定的排序方法 本章小节何谓排序交换式排序冒泡排序法快速排序法选择式排序选择排序法插入式排序插入排序法