快速排序的思想就是:分而治之,基本方法叫分冶法,不懂的可以去百度下。
关键点:找到基准数的位置,然后根据基准数分成左右两边。接着再分为两部分,递归的思想,一直下去,指导全部有序
首先选一个基准数,比如说选这样一个数组int[] a = {9,5,5,688,8,9,45,213,2,8,17,19};选择最左边的第一个9为基准,
选择从左右两头开始查找探测9应该放到的位置,这里记住,永远是右边先开始探测对比,,左边开始的下标我们用i标识,右边用j标识。下面看代码,相信程序猿一看就会明白
/**
* 分冶法,拆分成小的,各个击破
*/
public void quckSort(int[] a,int left, int right) {
//记住一定是右边先动
int i, j, t, temp;
if (left > right)//这里当左右两边碰头的时候就结束探测
return;
temp = a[left];//你选择的基准数,这里选择的是第一个
i = left;
j = right;
while (i != j) {
//记住一定是右边先动,j先开始探测
while (a[j]>=temp && i<j){
j--;
}
//然后左边动, i先开始探测
while (a[i]<=temp && i<j){
i++;
}
//这里当左右两个循环都跳出时候都各自找到了自己那边符合条件的那个数,然后交换
if(i<j) {
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
//递归,对两边的数据开始同样的探测,交换,最后达到有序
a[left] = a[i];
a[i] = temp;
quckSort(a,left,i-1);
quckSort(a,i+1,right);
}
@Test
public void test_quck(){
int[] a = {5,5,688,8,9,45,213,2,8,17,19};
for (int s:a) {
System.out.print(s+" ");
}
quckSort(a,0,a.length-1);
System.out.println();
for (int s:a) {
System.out.print(s+" ");
}
}
本文根据51上的大神学习而来,这位大神写的很形象明白,大家可以去看这篇文章:
http://developer.51cto.com/art/201403/430986.htm
网友评论