数据结构-快速排序-划分算法
来源:互联网 发布:dosbox运行windows 编辑:程序博客网 时间:2024/05/17 08:42
3、划分算法Partition
(1) 简单的划分方法
① 解决什么问题
快速排序算法里的partition函数用来解决这样一个问题:给定一个数组arr[]和数组中任意一个元素a,重排数组使得a左边都小于它,右边都不小于它
int partition(int arr[], int start, int end, int pivotIndex) pivotIndex为元素a的索引
int Partition(SeqList R,int i,int j)缺省任意元素a,表示以数组首元素为基准函数
① 函数返回值
基准元素最后被定为的位置
① 具体做法
第一步:(初始化)设置两个指针i和j,它们的初值分别为区间的下界和上界,即i=low,i=high;选取无序区的第一个记录R[i](即R[low])作为基准记录,并将它保存在变量pivot中;
第二步:令j自high起向左扫描,直到找到第1个关键字小于pivot.key的记录R[j],将R[j])移至i所指的位置上,这相当于R[j]和基准R[i](即pivot)进行了交换,使关键字小于基准关键字pivot.key的记录移到了基准的左边,交换后R[j]中相当于是pivot;然后,令i指针自i+1位置开始向右扫描,直至找到第1个关键字大于pivot.key的记录R[i],将R[i]移到i所指的位置上,这相当于交换了R[i]和基准R[j],使关键字大于基准关键字的记录移到了基准的右边,交换后R[i]中又相当于存放了pivot;接着令指针j自位置j-1开始向左扫描,如此交替改变扫描方向,从两端各自往中间靠拢,直至i=j时,i便是基准pivot最终的位置,将pivot放在此位置上就完成了一次划分。
②一次划分过程
一次划分过程中,具体变化情况【参见动画演示】
③划分算法:
int Partition(SeqList R,int i,int j)
{//调用Partition(R,low,high)时,对R[low..high]做划分,
//并返回基准记录的位置
ReceType pivot=R[i]; //用区间的第1个记录作为基准 '
while(i<j){ //从区间两端交替向中间扫描,直至i=j为止
while(i<j&&R[j].key>=pivot.key) //pivot相当于在位置i上
j--; //从右向左扫描,查找第1个关键字小于pivot.key的记录R[j]
if(i<j) //表示找到的R[j]的关键字<pivot.key
R[i++]=R[j]; //相当于交换R[i]和R[j],交换后i指针加1
while(i<j&&R[i].key<=pivot.key) //pivot相当于在位置j上
i++; //从左向右扫描,查找第1个关键字大于pivot.key的记录R[i]
if(i<j) //表示找到了R[i],使R[i].key>pivot.key
R[j--]=R[i]; //相当于交换R[i]和R[j],交换后j指针减1
} //endwhile
R[i]=pivot; //基准记录已被最后定位
return i;
} //partition
- 数据结构-快速排序-划分算法
- 数据结构与算法之七(划分算法与快速排序)
- // 快速排序中的划分 ,<<数据结构》算法10.6(b)
- [数据结构] 快速排序算法
- 数据结构-快速排序算法
- 数据结构--排序算法--快速排序
- 划分算法(快速排序的根基)
- 快速排序与其中的划分算法
- 数据结构与算法-快速排序
- 【数据结构与算法】快速排序
- [数据结构与算法]快速排序
- 数据结构与算法:快速排序
- 数据结构_快速排序算法
- 数据结构与算法-快速排序
- 数据结构与算法-----快速排序
- 数据结构学习--快速排序算法
- 数据结构算法之快速排序
- [数据结构与算法]快速排序
- ubuntu 使用过程中可能遇到的问题,和所需要用到的情况设置
- linux下查看文件和文件夹大小
- 适配器模式
- Java快速排序
- Java中instanceof详解
- 数据结构-快速排序-划分算法
- leetcode 题解 || Remove Nth Node From End of List 问题
- 有关 Hash Collision DoS 的一些问题
- 一个小C问题:计算从1970年到某一时期所经历的秒数
- Android的广播机制
- My Collection of Android Libraries
- 第6题作业
- C#学习笔记——新语法与语法糖
- 模板方法模式