排序和.pptVIP

  • 1
  • 0
  • 约5.37千字
  • 约 74页
  • 2017-11-09 发布于浙江
  • 举报
排序和

第10章 排序;;10.1 概述;内排序与外排序:内排序是指在排序期间数据对象全部存放在内存的排序;外排序是指在排序期间全部对象个数太多,不能同时存放在内存,必须根据排序过程的要求,不断在内、外存之间移动的排序。 排序的时间开销:排序的时间开销是衡量算法好坏的最重要的标志。排序的时间开销可用算法执行中的数据比较次数与数据移动次数来衡量。对于受对象关键字序列初始排列及对象个数影响较大的,需要按最好情况和最坏情况进行估算。;静态排序:排序的过程是对数据对象本身进行物理地重排,经过比较和判断,将对象移到合适的位置。这时,数据对象一般都存放在一个顺序的表中。 动态排序:给每个对象增加一个链接指针,在排序的过程中不移动对象或传送数据,仅通过修改链接指针来改变对象之间的逻辑顺序,从而达到排序的目的。 算法执行时所需的附加存储:评价算法好坏的另一标准。;衡量排序方法的标准 排序时所需要的平均比较次数 排序时所需要的平均移动次数 排序时所需要的平均辅助存储空间;10.2 插入排序;当插入第i (i ? 1) 个对象时,前面的V[0], V[1], …, v[i-1]已经排好序。这时,用v[i]的关键字与v[i-1], v[i-2], …的关键字顺序进行比较,找到插入位置即将v[i]插入,原位置上之后的所有对象依次向后顺移。;49 38 65 97 76 13 27;void InsertSort(SqList L) { for (int i=2;i=L.length;++i) if (LT(L.r[i].key,L.r[i-1].key))//小于就将L.r[i]插入排序子表 { L.r[0]=L.r[i]; // L.r[0]为监视哨 for (int j=i-1; LT(L.r[0].key,L.r[j].key); --j) L.r[j+1]=L.r[j]; L.r[j+1]=L.r[0]; } };算法分析;二、折半插入排序;例;算法分析;三、希尔排序;取d3=1 三趟分组:;例;;;起泡排序的基本方法是:设待排序对象序列中的对象个数为 n。最多作 n-1 趟排序。在第 i 趟中顺次两两比较r[j-1].Key和r[j].Key,j = i, i+1, ?, n-i-1。如果发生逆序,则交换r[j-1]和r[j]。;例;算法分析;二、快速排序;例;快速排序的一趟处理过程;int Partition(SqList L, int low, int high) { L.r[0] = L.r[low]; int pivotkey = L.r[low].key; while (low high) { while (lowhigh L.r[high].key = pivotkey) --high; L.r[low] = L.r[high]; while (lowhigh L.r[low].key = pivotkey) ++low; L.r[high] = L.r[low]; } L.r[low]=L.r[0]; return low; };算法分析;在最坏的情况,即待排序对象序列已经按其关键字从小到大排好序的情况下,其递归树成为单支树,每次划分只得到一个比上一次少一个对象的子序列。其排序速度退化到简单排序的水平,比直接插入排序还慢。占用附加存储(即栈)将达到O(n)。 若能更合理地选择基准对象,使得每次划分所得的两个子序列中的对象个数尽可能地接近,可以加速排序速度,但是由于对象的初始排列次序是随机的,这个要求很难办到。 快速排序是一种不稳定的排序方法。;10.4 选择排序;基本步骤为:i从1开始,直到n-1,进行n-1趟排序,第i 趟的排序过程为: 在一组对象r[i]~r[n] (i=1,2,…,n-1)中选择具有最小关键字的对象;并和第 i 个对象进行交换;;例;简单选择排序的算法 void SelectSort(SqList L) { for (int i=1; iL.length;++i) { int k=i; for (int j=i+1;j=L.length;++j) if (L.r[k].key L.r[j].key) k=j; if (i!=k){ ElemType temp=L.r[i]; L.r[i]=L.r[k]; L.r[k]=temp; } } };算法分析 ;二、树形选择排序(锦标赛排序) ;;

文档评论(0)

1亿VIP精品文档

相关文档