【编程素质】算法-快速排序
2017-04-27 16:45
204 查看
1,基本思想
1)整体思想
①先从数列中取出一个数作为基准数。②分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
③再对左右区间重复第二步,直到各区间只有一个数。
2)一次划分
①设置2个变量i=0、j=N-1;②第一个数为基准key;
③j向前搜索,j–,找到第一个比key小的数A[j],将A[i]与A[j]交换;
④i向后搜索,i++,找到第一个比key大的数A[i],将A[i]与A[j]交换;
⑤重复第三、四步,直到i>=j。
2,复杂度分析
快速排序的运行时间和划分是否对称有关。1)最坏情况
划分的2个区域包含n-1个和1个元素。T(n) = T(n-1) + O(n) = O(n^2)
2)最好情况
划分对称,2个区域都为n/2个元素。T(n) = 2T(n/2) + O(n) = O(nlogn)
3,demo
package QuickSort; /** * 快速排序(从大到小) * @author luo * 分析: * 1,分解:以a[p]为基准将啊[p:r]划分为3段:a[p:q-1](小于基准元素),a[q](等于基准元素即就是a[p]),a[q+1:r](大于基准) * 2,递归求解 * 3,合并 */ public class QuickSort { /** * 递归算法 * @param a * @param p 起始下标 * @param r 结束下标 */ public static void QuickSort1(int[] a,int p,int r){ if (p < r){ int q = Partition(a,p,r); QuickSort1(a,p,q-1); QuickSort1(a,q+1,r); } } /** * 划分元素 * a[p]为基准元素 * @param a * @param p 划分起始下标 * @param r 划分结束下标 * @return */ public static int Partition(int a[],int p,int r){ int temp=0;//存储交换 int i=p,j=r+1; /**基准*/ int x=a[p]; while(true) { while(a[++i]>x && i<r);//找出比x大的数 while(a[--j]<x);//找出比x小的数 if(i >= j) { break; } temp=a[i]; a[i]=a[j]; a[j]=temp; } a[p]=a[j]; a[j]=x; return j; } }
package QuickSort; public class Main{ public static void main(String[] args){ int[] a= {2,3,8,9,1}; QuickSort.QuickSort1(a, 0, 4); for (int i = 0; i < a.length; i++) { System.out.println(a[i]); } } }
相关文章推荐
- MoreWindows 专注于Windows编程 白话经典算法系列之六 快速排序 快速搞定
- 算法记录:二进制快速排序
- 算法与数据结构——快速排序 Quick Sort
- 读书笔记 算法导论 快速排序 QuickSort 使用最后一个元素作为pivot
- 程序员编程艺术(算法卷):第十章、如何给10^7个数据量的磁盘文件排序
- 快速排序 php实现 算法学习
- 快速排序的C#实现以及,算法导论上之后一个习题的思考
- C#编程之经典算法——排序(四)
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。
- C#算法-------(五)快速排序
- C#编程之经典算法——排序(二)
- 插入排序,合并排序,堆排序,快速排序,计数排序的实现(算法导论)
- 【经典算法】快速排序
- 快速排序与快速选择算法(quick sort and quick select algorithm)
- 算法导论 第七章快速排序与随机快速排序
- C#算法-------(四)快速排序
- c#与算法--快速排序
- 算法复习:快速排序
- 【快速排序】算法实现
- C#编程之经典算法——排序(三)