快速排序
2016-07-10 10:28
204 查看
快速排序
介绍
快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。
步骤
从数列中挑出一个元素,称为"基准"(pivot),重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
算法分析
算法复杂度平均情况:O(nlogn)O(nlogn)
稳定性
快速排序是一个不稳定的算法
演示
实例代码
/** * Created by csx on 2016/7/8. */ public class Utils { /** * 交换两个数 * @param a * @param i * @param j */ public static void swap(int[] a, int i, int j) { int temp = a[i]; a[i] = a[j]; a[j] = temp; } /** * 打印排序好的数 * @param a */ public static void print(int[] a) { for (int i : a) { System.out.print(i + "\t"); } System.out.println(); } } /** * Created by csx on 2016/7/10. */ public class QuitSort { /* * 快速排序 */ private static void quickSort(int[] a, int q, int r) { if(q<r){ int p=partition(a,q,r);//寻找中间元素的位置 quickSort(a,q,p-1); quickSort(a,p+1,r); } } /* * 寻找中间元素的位置,并返回。 * 因为要想达到最优 该排序必须是无序的,所以可以进行再一步优化 */ private static int partition(int[] a, int q, int r) { //优化 int rand=(int) (Math.random()*(r-q)); Utils.swap(a,q,q+rand); int i=q; int j=r+1; int x=a[q]; while(true){ while(a[++i]<x&&i<r); while(a[--j]>x); if(i>=j){ break; } Utils.swap(a, j, i); } Utils.swap(a,q,j); return j; } public static void main(String[] args) { int[] a=new int[]{2,5,1,7,8,10}; // bubbleSort_2(a); quickSort(a,0,a.length-1); Utils.print(a); } }
相关文章推荐
- 在命令行用 sort 进行排序
- 快速排序
- 文件遍历排序函数
- 关于C#中排序函数的总结
- C#选择排序法实例分析
- C#插入法排序算法实例分析
- C#实现Datatable排序的方法
- MYSQL必知必会读书笔记第五章之排序检索数据
- SQLSERVER的排序问题结果不是想要的
- Ruby实现插入排序算法及进阶的二路插入排序代码示例
- Windows Powershell排序和分组管道结果
- C#快速排序算法实例分析
- C#通过IComparable实现ListT.sort()排序
- C#递归算法之快速排序
- C#选择法排序实例分析
- SQL学习笔记四 聚合函数、排序方法
- C#对list列表进行随机排序的方法
- jQuery拖动元素并对元素进行重新排序
- 将MySQL查询结果按值排序的简要教程
- 深入解析桶排序算法及Node.js上JavaScript的代码实现