快速排序---《算法设计》
来源:互联网 发布:凡科建站怎么监测数据 编辑:程序博客网 时间:2024/06/06 20:34
快速排序
1.算法特点:
以某个记录为界(该记录称为支点或枢轴),将待排序列分成两部分:
①一部分: 所有记录的关键字大于等于支点记录的关键字
②另一部分: 所有记录的关键字小于支点记录的关键字
2.算法描述:
①任取待排序记录序列中的某个记录(例如取第一个记录)作为基准(枢),按照该记录的关键字大小,将整个记录序列划分为左右两个子序列
②左侧子序列中所有记录的关键字都小于或等于基准记录的关键字
③右侧子序列中所有记录的关键字都大于基准记录的关键字
④基准记录则排在这两个子序列中间(这也是该记录最终应安放的位置)。
⑤然后分别对这两个子序列重复施行上述方法,直到所有的记录都排在相应位置上为止。
②左侧子序列中所有记录的关键字都小于或等于基准记录的关键字
③右侧子序列中所有记录的关键字都大于基准记录的关键字
④基准记录则排在这两个子序列中间(这也是该记录最终应安放的位置)。
⑤然后分别对这两个子序列重复施行上述方法,直到所有的记录都排在相应位置上为止。
基准记录也称为枢轴(或支点)记录。取序列第一个记录为枢轴记录,其关键字为Pivotkey。指针low指向序列第一个记录位置,指针high指向序列最后一个记录位置。
3.算法分析:
①快速排序是一个递归过程,快速排序的趟数取决于递归树的高度。
②如果每次划分对一个记录定位后, 该记录的左侧子序列与右侧子序列的长度相同, 则下一步将是对两个长度减半的子序列进行排序, 这是最理想的情况。
②如果每次划分对一个记录定位后, 该记录的左侧子序列与右侧子序列的长度相同, 则下一步将是对两个长度减半的子序列进行排序, 这是最理想的情况。
4.算法评价:
时间复杂度:
最好情况(每次总是选到中间值作枢轴)T(n)=O(nlogn)
最坏情况(每次总是选到最小或最大元素作枢轴)T(n)=O(n²)
最坏情况(每次总是选到最小或最大元素作枢轴)T(n)=O(n²)
空间复杂度:需栈空间以实现递归
最坏情况:S(n)=O(n)
一般情况:S(n)=O(logn)
一般情况:S(n)=O(logn)
5.代码实现:
//划分,把数组a[p,r],划分为 a[p,j-1]+a[j]+a[j+1,r] j为枢纽的位置,该元素已经排好private int partition(int a[],int p,int r){//a[p]作为枢纽int i=p;int j=r+1;while(true){//从左往右查找,直到找到一个比枢纽大的数while(a[++i]<a[p] && i<r);//从右往左查找,直到找到一个比枢纽小的数//while(a[j--]>a[p]); //错!:此处最好先让j的值发生变化,在使用j,否则此时使用的j比后面用来判断的j会大1个单位//while(a[j]>a[p]){//AC : 此时 j的初始值应该就是 r . //j--;//}while(a[--j]>a[p]); //j的初始值应该是 r+1//当i>j是跳出循环if(i>=j){break;}//交换找到的两个数swap(a, i, j);}//进行一次循环后,得到的j就是枢纽的位置swap(a, j, p);return j;}private void quickSort(int a[],int p,int r){if(p<r){//保证至少有2个元素来进行划分int j=partition(a, p, r);quickSort(a, p, j-1);quickSort(a, j+1, r);}}@Testpublic void quickSortTest(){int a[]={1,0,-1,13,4,7,13,49,31,21,3};print(a);quickSort(a, 0, a.length-1);print(a);}
阅读全文
1 0
- 快速排序---《算法设计》
- 算法设计☞快速排序
- 【算法设计-快速排序】随机快速排序算法
- 快速排序算法设计,C++实现代码
- 快速排序 归并排序 算法设计与分析
- 算法设计与分析 快速排序的递归实现算法
- 排序算法--快速排序
- 排序算法--快速排序
- 排序算法---快速排序
- 排序算法-快速排序
- 排序算法------快速排序
- 排序算法---快速排序
- 排序算法-快速排序
- 排序算法---快速排序
- 排序算法--快速排序
- 排序算法--快速排序
- 排序算法--快速排序
- 排序算法:快速排序
- 三分法求函数最大值(求导求极值)
- 713总结
- 写了一个PHP智能标签输入效果
- jquery
- 538. Convert BST to Greater Tree
- 快速排序---《算法设计》
- java多位排序
- 2017.7.13 流水帐系列
- JS编程训练 | 题10:计数
- java.io(基本操作方式)
- docker之namespace编
- Spring源码之Resource加载源码解析(三)
- 1、Linux命令
- 一、Dreamweaver 8安装