您的位置:首页 > 理论基础 > 数据结构算法

[数据结构]原创!amor详解 快速排序 使用以及心得

2012-12-11 13:59 701 查看
amor详解 快速排序 使用以及心得
这是针对快速排序的详解,可以还不是很清楚,希望大家指正! 原文来自 http://www.liaoguodong.cn 作者 amor 欢迎大家前来!!

前言:快速排序作为专家测试,公认的最快的排序算法,相比冒泡排序,选择排序,插入排序等低级排序而言,是一个优秀的排序算法.对于初学者和兴趣爱好者有着较好的教学目的.在这人,我详解一下快速排序的原理,以及心得

快速排序的原理:

第一步:取第一个值为参考值mid

第二步:设立两个指针(下标),i指向第一个元素,j指向最后一个元素

第三步:从j开始逐步向前找一个小于mid的数与其交换

第四步:从i开始逐步向后找一个大于mid的数与其交换

如果i,j不相遇,那么重复第三步和第四步

快速排序的思想:将一个大的问题划分为一个小的问题,再这个小的问题细分

快速排序之所以快速,首先来说在时间上:快速排序的执行时间为=nlog2N

而低级排序为=n*n

那么就显而易见了,例如一个100个数字,那么低级排序的时间为100*100=10000O

注意O,为时间单位

而同样的100个数字,快速排序的时间为=100*log2100 =700

所以,在时间上,快速排序大大的超过了以往的低级排序速度

此图请结合下面代码一起阅读

下面是代码,使用,测试方法,直接将以下代码,复制,执行就可以了!

import java.util.Arrays;

public class 快速排序 {
public static void fastsort(int []a ,int left,int right){
/*
* 快速排序的原理:
第一步:取第一个值为参考值mid
第二步:设立两个指针(下标),i指向第一个元素,j指向最后一个元素
第三步:从j开始逐步向前找一个小于mid的数与其交换
第四步:从i开始逐步向后找一个大于mid的数与其交换
如果i,j不相遇,那么重复第三步和第四步
* */
//取参考值
int mid = a[left];
//设定两个指针
int i=left;
int j=right;
/*
*
* */

while(i<j){
//从j开始向前找一个小于mid的数与其交换  保证i和j不相等
/*
* 此处不易懂,所以详细讲解一下。   当a[j]>mid的时候,那么表示此数比mid大,那么这一位不动,然后把j的位置向前移动,然后又判断
* 当条件不符合的时候表示a[j]<mid,那么就是这个值比参考值要小,那么更进入if判断,和mid交换位置,从而达到mid的左边的值全部比mid大
*   注意:a[j]>=mid当不等于的时候,那么当数组有等等的数的时候,循环会陷入死循环的位置.切记!!!
* */
while(i<j&&a[j]>=mid){
j--;
}
if (i<j) {
int b=a[i];
a[i]=a[j];
a[j]=b;
}
/*
* 此处同上,保证mid右边的值全部比mid小
*
* */

//从i开始向后找一个大于mid的数与其交换
while(i<j&&a[i]<=mid){
i++;
}
if (i<j) {
int b=a[i];
a[i]=a[j];
a[j]=b;
}

}
/*
* 例如:原数组为int[] a={5,1,7,9,3,2,4,6,8};
* 那么在这人的排序后,会变成 5居中,1,3,2,4在5的右边,但是不一定是有顺序的,,只能保证5的右边都比5小,那么,左边同理
* */

//i j相遇,就以mid为断点,左边的全小,右边全大
//左边有数才快速排序
if(left<i){
/*在这儿使用了递归,自己调用自己的方法,当i和j相等时候就表示已经完成了排序
* */
fastsort(a, left, i-1);
}
if(j<right){
fastsort(a, j+1, right);
}

}

public static void main(String[] args) {

int [] a={4,5,5,3,2,4,6,7,9,3};
//		int[] a={5,1,7,9,3,2,4,6,8};
/*
* Arrays.sort(a);这是一个比较简单的排序方式,但是原理仍然是使用的快速排序,只是被封装了而已
* */
//	Arrays.sort(a);
fastsort(a, 0, a.length-1);
for(int i=0;i<a.length;i++){
System.out.print(a[i]+"\t");
}
}
}


这是针对快速排序的详解,可以还不是很清楚,希望大家指正! 原文来自 http://www.liaoguodong.cn 作者 amor 欢迎大家前来!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: