本文章参考博客:白话经典算法系列之六 快速排序 快速搞定
1.思路
1.数组中选一个基数key,通常是取数组第一个(这时候会在坐标0的位置留下空位);
2.定义两个指针left,right,分别指向数组最左端和最右端,并依次向数组中间逼近。先从右边开始判断,一直向左移动指针,直到数据小于基数key,将其移动到基数之前的坐标(基数留下的空位),移动完之后也会在坐标位置留下一个空位right;再从左边开始判断,一直向右移动指针,直到数据大于基数key,将其移动到刚才right移动所留下的空位上;最后当left==right时也会有个空位,再将基数放入这个空位中,这样一轮下来,left坐标位置的左侧所有的数都比基数key小,右侧所有的数都比基数大。
3.数组就一分为二,再用递归,分别对左右两侧的数组进行上述步骤。
2.代码
public static void quickSort(int[] array,int leftInput,int rightInput){
//因为坐标需要不停的变动,不能改动输入的参数(等会递归的时候需要用到),所以新建两个指针
int left = leftInput;
int right = rightInput;
//递归退出的条件
if (left >= right)
return;
//选基数
int key = array[left];
while (left < right){
while(left < right && array[right] >= key){
//从右侧找起,找一个比基数小的数
right--;
}
if (left < right){
//将这个数填充到基数刚才的坑上
array[left] = array[right];
left++;
}
while(left < right && array[left] <= key){
//从左侧找起,找一个比基数大的数
left++;
}
if (left < right){
//找到了,就将这个数放到刚才的位置上
array[right] = array[left];
right--;
}
}
//到这 left坐标和right坐标重叠,坐标左边的都比key大,坐标右边的都比key大
//把key放到left坐标位置上
array[left] = key;
//递归左边的数组
quickSort(array,leftInput,left-1);
//递归右侧的数组
quickSort(array,left+1,rightInput);
}
调用示例
public static void main(String[] args) {
int[] array = new int[]{11,55,22,14,44,55,33,6};
quickSort(array,0,array.length-1);
for(int c : array){
System.out.print(c+",");
}
}