待排序数组 a={2,10,8,9,0,-5}
1.首先设置两个变量 i,j 分别指向 数组第一个数字2,和最后一个数字 -5
2.a[j]从后往前找第一个比a[i]小的数字,然后 交换他们的位置。数组顺序为-5,10,8,9,0,2。a[j]变成了2.
3.再从前往后找第一个比a[j]大的数字,交换他们的位置。数组顺序为-5,2,8,9,0,10。
4.按照此方法进行比较和交换,直到i==j时第一趟排序完毕,此时将i减1,j加1,然后进入递归。
java代码:
/**
* Created by luwei on 2017/4/21.
* 快速排序
*/
public class QuickSort {
public static void main(String[] args) {
int[] a = {2,10,8,9,0,-5,10};
int start = 0;
int end = a.length - 1;
quickSort(a, start, end);
for (int k : a) {
System.out.print(k+" ");
}
}
public static void quickSort(int[] a, int start, int end) {
int i = start; //相当于i 左索引
int j = end; //相当于j 右索引
if (i >= j) {//判断是否到中间了,到中间返回
return;
}
//判断指针逻辑变量,从左搜索还是向右搜索
boolean flag = true;//false 左- >右 true 右->左
while (j != i) {
//如果i==j证明第一趟结束,每趟的标准值仅是一个,第一趟的标准值是第一个数字
if (a[i] > a[j]) {
//交换数字:比它小的元素放到左边 大的放到右边
int t = a[i];
a[i] = a[j];
a[j] = t;
flag = (flag == true) ? false : true;//取反
}
//将指针向前或者向后移动,
// false从左->右,true第二次从右到左
if (flag) {
j--;
} else {
i++;
}
}
/*排完第一次,再进行第二次的排列需要i-- 和 j++
保证指针的位置到达另外两个部分*/
i--;
j++;
//递归
quickSort(a, start, i);
quickSort(a, j, end);
}
}