插入排序解析.pptVIP

  • 4
  • 0
  • 约1.16万字
  • 约 62页
  • 2019-05-28 发布于江苏
  • 举报
概述 插入排序 快速排序 选择排序 归并排序 8.1 概 述 排序:将一个数据元素的任意序列,重新排列成一个按关键字有序的序列。 数据表(datalist): 它是待排序数据对象的有限集合。 主关键字(key): 数据对象有多个属性域, 即多个数据成员组成, 其中有一个属性域可用来区分对象, 作为排序依据,称为关键字。也称为排序码。 排序方法的稳定性: 如果在对象序列中有两 个对象Ri和Rj, 它们的排序码 Ki = Kj, 且在排序之前, 对象Ri排在Rj前面。如果在排序之后, 对象Ri仍在对象Rj的前面, 则称这个排序方法是稳定的, 否则称这个排序方法是不稳定的。 内排序与外排序: 内排序是指在排序期间数据对象全部存放在内存的排序;外排序是指在排序期间全部对象个数太多,不能同时存放在内存,必须根据排序过程的要求,不断在内、外存之间移动的排序。 排序的时间开销: 排序的时间开销是衡量算法好坏的最重要的标志。排序的时间开销可用算法执行中的数据比较次数与数据移动次数来衡量。 内排序分类 依不同原则 插入排序、交换排序、选择排序、归并排序、和计数排序等。 依所需工作量 简单排序时间复杂度O(n2) 先进排序方法时间复杂度O(n logn) 基数排序时间复杂度O(d.n) 8.2 插入排序 (Insert Sorting) 算法分析 设待排序对象个数为 n, 则该算法的主程序执行n-1趟。 排序码比较次数和对象移动次数与对象排序码的初始排列有关。 最好情况下(正序), 排序前对象已按排序码从小到大有序, 每趟只需与前面有序对象序列的最后一个对象比较1次, 移动0次对象, 总的排序 码比较次数为 n-1, 对象移动次数为 0。 最坏情况下(逆序), 第 i 趟时第 i 个记录必须与前面 i 个记录都做比较, 并且每做1次比较就要做1次记录移动。则总排序码比较次数KCN和记录移动次数RMN分别为 折半插入排序 (Binary Insertsort) 基本思想 设在顺序表中有一 个记录序列 V[1], V[2], …, V[n]。其中, V[1], V[2], …, V[i-1] 是已经排好序的记录。在插入V[i] 时, 利用折半查找法寻找V[i] 的插入位置。 8.3 快速排序 ( Quick Sort ) 起泡排序的算法(教材 page 16) void bubble_Sort ( int a[], int n ) { for (i=n,change=TRUE;i=2 change;--i){ change =FALSE; //假定未交换 for ( j = 1; j i; ++j ) if ( a[j] a[j+1] ) { //逆序 a[j] - a[j+1]; //交换 change = TRUE; //有交换 } } } 最坏的情形是初始序列为逆序,算法执行n-1趟起泡,第i趟做 n- i 次关键字比较, 执行 n-i 次记录交换。总的关键字比较次数KCN和记录移动次数RMN为: 快速排序 (Quick Sort) 基本思想:任取待排序记录序列中的某个记录(例如取第一个记录) 作为基准, 按照该记录的关键字大小,将整个记录序列划分为左右两个子序列: 左侧子序列中所有记录的排序码都小于或等于基准记录的排序码 右侧子序列中所有记录的排序码都大于基准记录的排序码 基准记录则排在这两个子序列中间(这也是该记录最终应安放的位置)。 分别对这两个子序列重复施行上述方法,直到所有的记录都排在相应位置上为止。 基准记录也称为枢轴(或支点)(pivot)记录。 算法Partition利用序列第一个对象作为基准,将整个序列划分为左右两个子序列。算法中执行了一个循环, 只要是排序码小于基准对象排序码的对象都移到序列左侧, 最后基准对象安放到位, 函数返回其位置。 算法分析 快速排序的趟数取决于递归树的高度。 如果每次划分对一个记录定位后, 该记录的左侧子序列与右侧子序列的长度相同, 则下 一步将是对两个长度减半的子序列进行排序, 这是最理想的情况。 在 n个元素的序列中, 对一个记录定位所需时间为 O(n)。若设 t (n) 是对 n 个元素的序列进行排序所需的时间, 而且每次对一个记录正确定位后, 正好把序列划分为长度相等的两个子序列, 此时, 总的计算时间为: T(n) ? cn + 2T(n/2 ) // c 是一个常数 ? cn + 2 ( cn/2 + 2T(

文档评论(0)

1亿VIP精品文档

相关文档