第6章排序与选择1-(公开课件).pptVIP

  • 0
  • 0
  • 约6.37千字
  • 约 24页
  • 2019-12-20 发布于广西
  • 举报
第六章 排序与选择 排序定义——将一个数据元素(或记录)的任意序列,重新排列成一个按关键码有序的序列叫~ 排序基本操作 比较两个关键字大小 将记录从一个位置移动到另一个位置 排序分类 按待排序记录所在位置 内部排序:在排序过程中,所有需要排序的数都在内存,并在内存中调整它们的存储顺序,称为内排序; 外部排序:在排序过程中,只有部分数被调入内存,并借助内存调整数在外存中的存放顺序排序方法称为外排序。 稳定排序和非稳定排序 稳定排序是所有相等的数经过某种排序方法后,仍能保持它们在排序之前的相对次序,反之,就是非稳定的排序。 插入排序 直接插入排序 直接插入排序是最简单的排序方法之一,它的插入定位是通过将插入元素与有序区的各记录自右向左依次比较其大小来确定的。 [例1] 设待排序的元素共7个,分别为:8,3,2,5,9,3,6。直接插入排序过程如图6-1所示。 初始元素序列 :( 8 ) [ 3 2 5 9 3 6 ] 在直接插入排序中将第i个元素 r[i]插出到有序区中可通过如下步骤实现: (1)定位初始化: r[0]=r[i] ; j=i-1 ; r[0]是监视哨,存放当前待插入元素, j为待定的插入位置,初值为:i-1; (2)定位 while( r[0] r[j]) { r[j+1]= r[j] ; j-- ; } 退出循环时, r[j]是第一个小于等于 r[0]的元素,j+1指出插入位置,且 r[j+1]位置元素已被移走。 (3)插入 r[j+1]= r[0] ; void InsertSort ( int r[ ], int n) { int i , j; for(i=2;i=n;i++) { r[0]=r[i]; j=i-1; while(r[0]r[j]) { r[j+1]=r[j]; j--; } r[j+1]=r[0]; } } 算法中引进监视哨的作用: 作用一:在进入确定插入位置的循环之前,保存了r[i]的副本,避免因元素的后移而丢失r[i]中的内容; 作用二:使得内循环总能够结束,以免循环过程中数组下标越界。 冒泡排序 ( )[ 7 53 36 48 36 60 18 41 ] [例2] 设初始元素序列为 [53,36,48,36,60,7,18,41],用冒泡排序方法进行排序,写出每趟的结果。 从上图的冒泡全过程可知,第i趟冒泡,无序区共有n-i+1个元素,经过n-i次相邻两元素的比较及交换,无序区中最小元素就“飘浮”到有序区,每一趟冒泡后,无序区减少一个元素,有序区增加一个元素,所以最多只需进行n-1趟冒泡,排序就能完成。 依次对无序区相邻元素作比较和交换: for(j=n ; ji ;j--) if( r[j]r[j-1] ) 将r[j]和r[j-1] 交换 void BubbleSort ( int r[ ], int n ) { int i, j; for (i=1;i=n-1;i++) for(j=n;ji;j--) if(r[j]r[j-1]) { r[0]=r[j]; r[j]=r[j-1]; r[j-1]=r[0]; } } 改进的冒泡排序算法 在冒泡排序过程中,一旦发现某一趟没有进行交换操作,就表明此时待排序记录序列已经成为有序序列,冒泡排序再进行下去已经没有必要,应立即结束排序过程。 解决方案,可在程序中设置一个标志变量flag,用来标记每趟冒泡是否发生元素交换,若无交换则排序结束。 void BubbleSort ( int r[ ], int

文档评论(0)

1亿VIP精品文档

相关文档