您的位置:首页 > 产品设计 > UI/UE

quick_sort新手入门

2016-09-14 23:00 204 查看
一直说要开通个博客,一直拖拖拉拉的到现在,想写点东西能给自己整理下思路,也能帮助下可爱的同学,水平有限,有不足可以指正,不喜勿喷

在java中有个叫Arrays.sort()的方法,可以为我们实现对数组的升序排序,实际上,它使用的是一种经过优化的快速排序,而快速排序是普通冒泡排序的改进。

对于一个给定的数组array,快速排序的思想是,选取其中一个元素k1作为关键字,通过一定的方法把小于k1的所有元素移动到k1的左边,大于k1的元素移动到k1的右边。

举个例子,有这样一个数组array:

57,68,59,52,72,28,96,33,24,19

假设我们选取57为k1,通过移动分为

19,24,33,52,28,57,96,72,59,68;

令S1={19,24,33,52,28},S2={96,72,59,68}

对S1,S2两个子集分别再做一次这样的操作,不断细分,最后达到每一个元素,左边的比右边的小,实现排序。

至于如何实现元素的移动,给出一个图可能更方理解,图是网上找的,画质有点模糊,不过不影响我们分析问题。



源码如下,亲测可用

public static void quick_sort(int[] array,int left,int right){//left,right刚开始分别是57,19
if(left<right){//每次递归调用执行这一步,用于判断是否已经到了最底层
//把每一个子序列的左右游标分别赋值给零时变量,一般选取最左边的作为基准值
int i=left,j=right,referenceValue=array[left];
//在执行循环过程中,i,j的值是会更改的
while(i<j){
while(i<j && array[j]>=referenceValue){
j--;
}
if(i<j){
//这里其实有个很巧妙的操作,i++就是自身+1,但是自加之前进行运算
//假设原来i=3,这个语句执行的时候,i++,i瞬间变为4
//但是还是用i=3进行操作,也就是array[3]=array[j];
array[i++]=array[j];
//这个代码可以等价为array[i]=array[j];i++
}
//这里是左游标往右边移动,具体过程跟上面相反
while(i<j && array[i]<referenceValue){
i++;
}
if(i<j){
array[j--]=array[i];
}
}

array[i]=referenceValue;
quick_sort(array,left,i-1);
quick_sort(array,i+1,right);

}
}
以下是测试代码

public static void main(String[] argt){
int[] array={57,68,59,52,72,28,96,33,24,19};
int left=0,right=array.length-1;
quick_sort(array,left,right);
for(int i=0;i<array.length;i++){
System.out.println(array[i]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 快速排序