赞
踩
快速排序是对 冒泡排序 的一种 改进。它的基本思想是∶通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序, 整个排序过程可以递归进行, 以此达到整个数据变成有序序列。
快排 和 归并排序 是相似的,不同的是 归并排序是直接分组,而快排是有要求的进行分组。但快排 没有所谓的 辅助数组,所以要比 归并排序省一部分空间。
需求:
排序前:{6,1,2,7,9,3,4,5,8}
排序后:{1,2,3,4,5,6,7,8,9}
排序原理∶
把一个数组切分成两个子数组的基本思想:
解决二元素一组问题和需要注意的事项
快速排序 算法代码
package com.muquanyu.algorithm.sort;
public class Quick {
/*
比较 元素 v 是否 小于 元素 w
*/
private static boolean less(Comparable v,Comparable w){
return v.compareTo(w) < 0;
}
/*
数组元素 i 和 j 交换位置
*/
private static void exch(Comparable[] a,int i,int j)
{
Comparable temp = a[i];
a[i] = a[j];
a[j] = temp;
}
/*
对数组 a 中的元素 进行排序
*/
public static void sort(Comparable[] a)
{
int lo = 0;
int hi = a.length - 1;
sort(a,lo,hi);
}
/*
对数组 a 中 从 lo 到 hi 的元素 进行排序
*/
private static void sort(Comparable[] a,int lo,int hi)
{
//安全性校验
if(lo > hi)
{
return;
}
//切记:partation 返回的索引是 分组后的 分界值 索引
int partation = partation(a,lo,hi);
//让左子组有序
sort(a,lo,partation-1);
//让右子组有序
sort(a,partation+1,hi);
}
private static int partation(Comparable[] a,int lo,int hi)
{
Comparable key = a[lo];
//设定两个指针
int left = lo;
int right = hi + 1;
while(true)
{
while(less(key,a[--right]))
{
if(right == lo)
{
break;
}
}
while(less(a[++left],key))
{
if(left == hi)
{
break;
}
}
if(left >= right)
{
break;
}else{
exch(a,left,right);
}
}
/*while(true)
{
while(less(key,a[right]))
{
if(right == lo)
{
break;
}
right--;
}
while(less(a[left],key))
{
if(left == hi)
{
break;
}
left++;
}
if(left >= right)
{
break;
}
exch(a,left,right);
}*/
exch(a,lo,right);
return right;
}
}
快速排序 算法测试
package com.muquanyu.algorithm.test;
import com.muquanyu.algorithm.sort.Quick;
import java.util.Arrays;
public class QuickTest {
public static void main(String[] args) {
Integer[] arr = {6,1,2,7,9,3,4,5,8};
Quick.sort(arr);
System.out.println(Arrays.toString(arr));
}
}
快速排序是另外一种分治的排序算法,它将一个数组分成两个子数组,将两部分独立的排序。快速排序和归并排序是互补的:归并排序将数组分成两个子数组分别排序,并将有序的子数组归并从而将整个数组排序,而快速排序的方式则是当两个数组都有序时,整个数组自然就有序了。在归并排序中,一个数组被等分为两半,归并调用发生在处理整个数组之前,在快速排序中,切分数组的位置取决于数组的内容,递归调用发生在处理整个数组之后。
快速排序的一次切分从两头开始交替搜索,直到left和right重合,因此,一次切分算法的时间复杂度为o(n),但整个快速排疗的时间复杂度和切分的次数相关。
最优情况∶每一次切分选择的基准数字刚好将当前序列等分。
反正 我在 测快排的时候挺慢的,没有 希尔排序 和 归并排序快!也不知为啥,差了将近 10倍,而且 好像是 递归 压栈的事,10w条 逆序数据,就处理不了了!直接 就提示栈溢出了。
但是 官方说 快排的 时间复杂度 是 O(n) = n lgn
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。