快速排序
来源:互联网 发布:vb求3-100以内的质数 编辑:程序博客网 时间:2024/06/08 16:13
快速排序
最常用的排序算法,时间复杂度最好为O(nlogn),最差为平方级。具体的原理不再此介绍。此处记录一下代码实现以及提升快排性能的方法。
切换插入排序
对于小数组来说,插入排序速度很快,因此可以根据数组大小选择排序算法,长度小于定值时选择插入排序,大于时选择快排。
if(hi<lo+M) {Insertion.sort(a,lo,hi); return;}
三取样切分
当数组中重复元素较多时,实际上进行了很多无谓的交换。此时我们采用一种改进的快速排序来减小对重复元素的交换。
选定a[lo]=v进行切分,从左到右遍历数组一次,维护一个指针lt,使得a[lo…lt-1]的元素都小于v;一个指针gt,使得a[gt+1…hi]的元素都大于v;一个指针i,得a[lt…i-1]的元素都等于v,a[i…gt]的元素未确定。
- a[i]小于v,将a[lt]和a[i]交换,将lt和i加一;
- a[i]大于v,将a[gt]和a[i]交换,gt减一;
- a[i]等于v,将i加一;
普通快速排序和三取样切分快排Java代码如下:
package com.company;public class Main { public static void main(String[] args) { int[] a = {3,5,4,3,9,0,2,2}; sort(a); for(int i=0;i<8;i++) { System.out.println(a[i]); } } public static void sort(int[] a) { sort3(a,0,a.length-1); } public static void sort(int[] a,int lo,int hi) { if(lo>=hi) return; int j = partition(a,lo,hi); sort(a,lo,j-1); sort(a,j+1,hi); } public static int partition(int[] a,int lo,int hi) { //切分代码 int i = lo; int j = hi+1; int v = a[lo]; while(true) { while(a[++i]<v) if(i==hi) break; while(a[--j]>v) if(j==lo) break; if(i>=j) break; exchange(a,i,j); } exchange(a,lo,j); return j; } public static void sort3(int[] a,int lo,int hi) { //三向切分快速排序 if(hi<=lo) return; int lt=lo,i=lo+1,gt=hi; int v = a[lo]; while(i<=gt) { if(a[i]<v) { exchange(a,i,lt); i++; lt++; } else if(a[i]>v) { exchange(a,i,gt); gt--; } else { i++; } } sort3(a,lo,lt-1); sort3(a,gt+1,hi); } public static void exchange(int[] a,int i,int j) { //交换代码 int temp; temp = a[i]; a[i] = a[j]; a[j] = temp; }}
阅读全文
0 0
- 快速排序
- 快速排序
- 快速排序
- 快速排序!
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- bzoj1911: [Apio2010]特别行动队(斜率优化+Dp)
- ubuntu静态、动态设置ip地址
- [RK3288][Android6.0] 移植笔记 --- Touch IC GT928添加
- 原生JS-jQuery : HTML 操作
- Wannafly模拟赛4-C-sum(二进制拆分+树状数组)
- 快速排序
- 最左前缀 联合索引
- 陈越姥姥 数据结构之树
- mysql的分页优化例子
- Git的使用--如何将本地项目上传到Github
- 模板实参推断和引用以及move和forward详解
- 如何在 Laravel 中 “规范” 的开发验证码发送功能
- 欢迎使用CSDN-markdown编辑器
- C++书目推荐