知识大全 排序 - 交换排序 - 快速排序 (二)
Posted 知
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 排序 - 交换排序 - 快速排序 (二)相关的知识,希望对你有一定的参考价值。
划分算法Partition
( ) 简单的划分方法
① 具体做法
第一步 (初始化)设置两个指针i和j 它们的初值分别为区间的下界和上界 即i=low i=high;选取无序区的第一个记录
R[i](即R[low])作为基准记录 并将它保存在变量pivot中;
第二步 令j自high起向左扫描 直到找到第 个关键字小于pivot key的记录R[j] 将R[j])移至i所指的位置上 这相当于
R[j]和基准R[i](即pivot)进行了交换 使关键字小于基准关键字pivot key的记录移到了基准的左边 交换后R[j]中相当于是
pivot;然后 令i指针自i+ 位置开始向右扫描 直至找到第 个关键字大于pivot key的记录R[i] 将R[i]移到i所指的位置上 这
相当于交换了R[i]和基准R[j] 使关键字大于基准关键字的记录移到了基准的右边 交换后R[i]中又相当于存放了pivot;接着令指
针j自位置j 开始向左扫描 如此交替改变扫描方向 从两端各自往中间靠拢 直至i=j时 i便是基准pivot最终的位置 将
pivot放在此位置上就完成了一次划分
②一次划分过程
一次划分过程中 具体变化情况【 参见动画演示 】
③划分算法
int Partition(SeqList R int i int j)
//调用Partition(R low high)时 对R[low high]做划分
//并返回基准记录的位置
ReceType pivot=R[i]; //用区间的第 个记录作为基准
while(i
while(i
j--; //从右向左扫描,查找第1个关键字小于pivot.key的记录R[j]
if(i
R[i++]=R[j]; //相当于交换R[i]和R[j],交换后i指针加1
while(i
i++; //从左向右扫描,查找第1个关键字大于pivot.key的记录R[i]
if(i
R[j--]=R[i]; //相当于交换R[i]和R[j],交换后j指针减1
//endwhile
R[i]=pivot; //基准记录已被最后定位
return i;
//partition
cha138/Article/program/sjjg/201311/23788相关参考
快速排序执行过程 快速排序执行的全过程可用递归树来描述 > > 分析 ()递归执行的路线如图中带箭头的包络线所示 ()递归树上每一结点左旁方括号表示当前待排序的区间结点内的关键字是划分
快速排序 快速排序(QuickSort)通过一趟排序将待排记录分割成独立的两部分其中一部分记录的关键字均比另一部分记录的关键字小则可分别对这两部分记录继续进行排序以达到整个序列有序快速排序三个步骤
算法分析 快速排序的时间主要耗费在划分操作上对长度为k的区间进行划分共需k次关键字的比较 ()最坏时间复杂度 最坏情况是每次划分选取的基准都是当前无序区中关键字最小(或最大)的记录划分的结果
交换排序的基本思想是两两比较待排序记录的关键字发现两个记录的次序相反时即进行交换直到没有反序的记录为止 应用交换排序基本思想的主要排序方法有冒泡排序和快速排序 冒泡排序 排序方法 将被排序
算法分析 ()算法的最好时间复杂度 若文件的初始状态是正序的一趟扫描即可完成排序所需的关键字比较次数C和记录移动次数M均达到最小值 Cmin=n Mmin= 冒泡排序最好的时间复杂度为O
堆排序 堆的定义n个元素的序列kk…kn)当且仅当满足以下关系时称之为堆 若将和序列kk…kn)对应的一维数组(即以一维数组作此序列的存储结构)看成是一个完全二
交换排序的基本思想两两比较待排序记录的关键字发现两个记录的次序相反时即进行交换直到没有反序的记录为止 冒泡排序 冒泡排序将当前未排序的记录自上而下依次对相邻的两个记录进行比较若为逆序则
经过排序后这些具有相同关键字的记录之间的相对次序保持不变则称这种排序方法是稳定的否则排序算法是不稳定的 排序过程中不涉及数据的内外存交换则称之为内部排序(内排序)反之若存在数据的内外存交换则称之
排序是组织数据最基本的运算排序的方法也很多本章给出了几种典型的排序方法见下表 排序类别插入排序交换排序选择排序归并排序分配排序 排序方法直接插入冒泡法直接选择*归并排序箱排序 希尔排序*快速
选择排序(SelectionSort)的基本思想是每一趟从待排序的记录中选出关键字最小的记录顺序放在已排好序的子文件的最后直到全部记录排序完毕 直接选择排序 直接选择排序(Straig