本文我准备用Java实现快速排序。具体的排序算法过程已经在注释里面了,大家可以复制代码到IDE里面,用DEBUG模式研究算法的过程:
import java.util.Arrays;
import java.util.Random;
/**
* @author LiYang
* @ClassName QuickSort
* @Description 快速排序算法
* @date 2019/11/4 11:29
*/
public class QuickSort {
/**
* 快速排序算法(QuickSort)
* @param arr 待排序的数组
* @param low 排序区域的左边界
* @param high 排序区域的右边界
*/
public static void quickSort(int[] arr, int low, int high) {
//左边界即为左指针
int left = low;
//右边界即为右指针
int right = high;
//快排枢纽元,此处我们选左边第一个数为枢纽元
int pivot = arr[low];
//左右指针未重合
while(left < right){
//如果左右指针未重合,并且右边的数字大于等于枢纽元(先从右往左找)
while(left < right && arr[right] >= pivot){
//则该数字不需要移动,右指针往左挪动一位
right --;
}
//如果左右指针未重合
if(left < right){
/*
此时的右指针数字是小于枢纽元的,需要移动到左边
且现在左指针的数字是枢纽元,已经记录下来,所以可以直接覆盖
将右边的数字赋值给左指针数字,然后右边数字又相当于空了出来
之后左指针找到的大于枢纽元的数字,又可以直接覆盖右指针的数字
*/
arr[left] = arr[right];
//此时左指针的数字已经排好序了,就往右挪一位,开始从左往右找
left ++;
}
//如果左右指针未重合,并且左边的数字小于枢纽元(再从左往右找)
while(left < right && arr[left] < pivot){
//则该数字不需要移动,左指针往右挪动一位
left ++;
}
//如果左右指针未重合
if(left < right){
/*
此时左指针的数字是大于或等于枢纽元,需要放在右边,
而且右指针的数字是可以覆盖的,所以可以直接将左指针
的数字赋值给右指针的数字
*/
arr[right] = arr[left];
//此时右指针已经排好序了,就往左挪一位,准备继续从右往左找
right --;
}
}
/*
大while循环结束,left=right,枢纽元就该在这个位置,且枢纽元左边的都
小于枢纽元,枢纽元右边的都大于等于枢纽元,就可以以枢纽元为分隔,左右
两边的子数组再递归进行快速排序了,直到所有的子数组长度都为1
*/
arr[left] = pivot;
//如果左边的数组长度大于1
if(low < left - 1){
//快排左子数组
quickSort(arr, low, left - 1);
}
//如果右边的数组长度大于1
if(right + 1 < high){
//快排右子数组
quickSort(arr, right + 1, high);
}
}
/**
* 快速排序(QuickSort)的驱动程序
* @param arr 待排序的数组
*/
public static void quickSort(int[] arr) {
//快速排序的左边界
int low = 0;
//快速排序的右边界
int high = arr.length - 1;
//调用快速排序的方法
quickSort(arr, low, high);
}
/**
* 验证快速排序算法
* @param args
*/
public static void main(String[] args) {
//待排序数组
int[] arr = new int[30];
//随机数类
Random random = new Random();
//随机生成排序数组(100以内的整数)
for (int i = 0; i < arr.length; i++) {
arr[i] = random.nextInt(100);
}
//打印待排序数组
System.out.println("快速排序前:" + Arrays.toString(arr));
//进行快速排序(调用驱动程序,就是只有一个参数的quickSort()方法)
quickSort(arr);
//打印快速排序后的数组
System.out.println("快速排序后:" +Arrays.toString(arr));
}
}
运行 QuickSort 类的main方法,快速排序算法测试通过:
快速排序前:[89, 48, 52, 65, 21, 95, 19, 8, 78, 15, 32, 40, 84, 43, 0, 2, 23, 45, 21, 85, 13, 91, 60, 7, 44, 53, 16, 27, 5, 82]
快速排序后:[0, 2, 5, 7, 8, 13, 15, 16, 19, 21, 21, 23, 27, 32, 40, 43, 44, 45, 48, 52, 53, 60, 65, 78, 82, 84, 85, 89, 91, 95]