今天记录一下快速排序的一个写法吧(二分查找法);
思维部分(建议理解后看代码):
给定一个int数组,将这个数组排序;
上面的是第一轮的排序,然后从指针的位置分成两部分,左边的位置和右边的位置单独这样遍历;
直到将这个数组遍历到底(递归思想,如果想不通的同学可以看下我前面的文章,这里就不多说了)
上面的是思想,如果没想通看下面的代码有可能会有些困惑;
代码部分:
/**
* 快速排序
* 适用于数组
*/
public void quickSort(int[] array, int begin, int end){
if ((end - begin) <= 0){
return;
}
int x = array[begin];
int low = begin;
int high = end;
//定义true是右向左开始,因为x的值取得是左边的值开始的
boolean direction = true;
L:
while (low < high){
if (direction){
for (int i = high; i > low; i--){
//如果遇到小于x的值,
if (array[i] <= x){
array[low++] = x;
high = i;
direction = !direction;
continue L;
}
}
//如果没有进循环,说明指针相等了
high = low;
} else {
for (int i = low; i < high; i++){
//如果遇到小于x的值,
if (array[i] <= x){
array[high--] = x;
low = i;
direction = !direction;
continue L;
}
}
//如果没有进循环,说明指针相等了
low = high;
}
}
//最后把x放在数组里;
array[low] = x;
//开始完成左右两边的排序
//左边的肯定都比array【low】小,所以从low-1结束
//右边的肯定都比array【low】大,所以从low+1开始
quickSort(array, begin, low-1);
quickSort(array, low+1, end);
}
我的测试代码(和上面的四维图不匹配哦):
@Test
public void quickSortTest(){
int[] array = new int[]{1,3,4,5,7,8,10,14, 15, 16, 18, 25,30};
quickSort(array, 0, array.length-1);
for (int i :array){
System.out.print(i + " ");
}
}