数据结构学习12——快速排序
来源:互联网 发布:python twisted下载 编辑:程序博客网 时间:2024/06/10 00:38
快速排序算法思想:通过一趟排序将待排记录分割成独立的两部分,其中一部分的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。
关于对于快速排序的来说,它的基本思路是一分为二,那么如何一分为二,在何处值进行一分为二则是快速排序算法中的核心。
假设我们设一分为二的点为中枢值pivot:
void QSort(SqList *L,int low,int high){if(low<high){pivot=Partition(L,low,high);QSort(L,low,piovot-1);//对低子表进行排序QSort(L,piovt+1,high);//对高子表进行排序}}
上述代码可以发现,假设我们要对{50,10,90,30,70,40,80,60,20}进行排序,在执行完Partition(L,1,9)以后就返回5给pivot,数字5表明50放置在数组下标5的位置。此时计算机就把数组编程了位于50左和右小数组{20,10,40,30}和{70,80,60,90}
然后再递归调用QSort(L,1,5-1),QSort(L,5+1,9);其实就是对{20,10,40,30}和{70,80,60,90}进行同样的Partition操作,直到顺序全部正确为止。因此接下来就是Partition函数的实现:
int Partition(SqList *L,int low,int high){int pivotkey;pivotkey=L->r[low];while(low<high){while(low<high&&L->r[high]>=pivotkey){high--;}swap(L,low,high);while(low<high&&L->r[low]<=pivotkey){low++;}swap(L,low,high);}
算法实现案列:
运行结果如图所示:
、
针对上述的实现代码我们来分析:
要完成一个快速排序需要实现哪几个方面:
(1)将原有的一个数组分割成两部分,如何分割?
找到一个枢轴值,一部分要比这个小,另一部分要比这个大。如何找????
这个就在Partition中实现:
(2)分割成两部分以后,如何再进行排序操作??
其实就是递归调用,对低子表递归排序,再对高子表进行递归排序。
问题描述:
快递排序优化:
(1)优化1:其实对快递排序优化的问题主要是对枢轴值的优化:比如对于数组{9,1,5,8,3,7,4,6,2}而言,如果选取第一个值为枢轴值的话,其实就是只交换了9与2,就无法进行下去了。
对于这个枢轴值的瓶颈问题进行优化:
优化方案(三数取中法):即取三个关键字进行排序,将中间数作为枢轴,一般取左端、右端和中间三个数,但是也可以随机选取。
- 数据结构学习12——快速排序
- 数据结构 — 快速排序
- 数据结构学习--快速排序
- 数据结构——快速排序
- 数据结构——快速排序
- 数据结构——快速排序
- 数据结构—快速排序模型
- 数据结构【排序算法】——快速排序
- 数据结构学习--快速排序算法
- 再看数据结构之——快速排序
- 数据结构与算法——快速排序
- 数据结构——快速排序算法
- 数据结构与算法——快速排序
- 数据结构算法——快速排序
- 数据结构之——快速排序
- 数据结构之——快速排序
- java-数据结构——快速排序
- 数据结构与算法——快速排序
- crawler4j源码分析(四)Parser
- python登陆Discuz!论坛通用代码
- php 解决MySQL插入数据出现 Incorrect string value: '\xF0\x9F\x92\x8BTi...'错误
- union关键字
- python try except else finally 执行顺序详细分析
- 数据结构学习12——快速排序
- [golang]自己动手实现ini文件读取
- JFreeChart的使用
- 为什么要使用SVN
- 黑马程序员_7K面试题之银行调度业务
- PAT_1016
- 1007
- 用ThinkPHP框架遇到的狗血bug:包含common.php时报函数重复声明的错误。
- python文件与目录操作方法大全