快排的基本思路为先确定出一个基准数(取第一个数为基准数),然后通过与基准数循环比较的方法,将所有比基准数小的数字放在它的左边,所有比它大的数字放在右边,实现一部分数字都比另一部分小。然后再通过此方法对这两部分数据分别进行相同的操作,整个过程可以通过递归实现,最后对所有数字进行排序。
代码演示如下:
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
//定义一个数组,使用快排进行排序
int[] arr = {10, 5, 78, 45, 33, 98, 67, 19, 4, 99, 46};
//调用快排的方法,参数为数组,数组的第一个索引,数组的最后一个索引
quiteSort(arr, 0, arr.length - 1);
//打印数组
System.out.println(Arrays.toString(arr));
}
//快排的方法
private static void quiteSort(int[] arr, int left, int right) {
//递归结束的条件
if(left > right){
//结束这个方法
return;
}
//记录第一个元素的索引位置
int left0 = left;
//记录最后一个元素的索引位置
int right0 = right;
//将第一个元素设置为基准数
int baseNumber = arr[left];
//如果左边不等于右边则循环比较
while (left != right){
//先比较数组右边的元素,如果右边的元素不小于基准数,则right向前移动
//直到小于基准数时结束循环,同时要保证左边索引小于右边索引
while(arr[right] >= baseNumber && left < right){
right--;
}
//再比较数组左边的元素,如果左边的元素不大于基准数,则left向后移动
//直到大于基准数时结束循环,同时要保证左边索引大于右边索引
while (arr[left] <= baseNumber && left < right){
left++;
}
//交换元素,小的放左边,大的放右边
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
}
//当循环结束后,左边索引等于右边索引,此时进行基准数归位
//所有比基准数大的都在右边,比基准数小的都在左边,
int temp = arr[left];
arr[left] = baseNumber;
arr[left0] = temp;
//递归左边调用该方法进行排序,传入参数该数组,数组的第一个索引,数组左边最后一个索引
//将基准数左边的元素排序
quiteSort(arr, left0, left - 1);
//递归右边调用该方法进行排序,传入参数该数组,数组右边第一个索引,数组最后一个索引
//将基准数右边的元素排序
quiteSort(arr, right + 1, right0);
}
}