快排(冒泡升级版)
快速排序(快排)
快速排序
由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
/**
* 快排
*
* @author lyn
* @date 2022/3/3 10:09
*/
public class QuickSort {
private static int count;
private static int index;
public static void main(String[] args) {
int[] num = {1, 2, 5, 8, 56, 42, 43, 82, 33, 13, 19};
printArrToStr(num, "排序前: ");
//bubbleSort(num);
quickSort(num, 0, num.length - 1);
printArrToStr(num, "排序后: ");
System.out.println("循环次数: " + count);
}
/**
* 快排(冒泡的升级版)
*
* @param num 数组
* @param left 左光标的索引
* @param right 右光标的索引
*/
public static void quickSort(int[] num, int left, int right) {
//如果左光标left大于右光标,则停止
if (left >= right) {
return;
}
//记录最初的key
int key = num[left];
int i = left;
int j = right;
while (i < j) {
//右光标左移,遇到比key小的停止
while (num[j] >= key && i < j) {
j--;
}
//左光标右移,遇到比key大的停止
while (num[i] <= key && i < j) {
i++;
}
//相互交换位置
if (i < j) {
int temp = num[i];
num[i] = num[j];
num[j] = temp;
}
}
//更新key的值
num[left] = num[i];
num[i] = key;
count++;
//以i为界再进行两次排序
quickSort(num, left, i - 1);
quickSort(num, i + 1, right);
}
/**
* 冒泡排序
*
* @param num 数组
*/
public static void bubbleSort(int[] num) {
int temp;
for (int i = 0; i < num.length - 1; i++) {
for (int j = 0; j < num.length - i - 1; j++) {
index++;
if (num[j] > num[j + 1]) {
temp = num[j];
num[j] = num[j + 1];
num[j + 1] = temp;
}
}
}
}
/**
* 打印数组
*
* @param num
* @param text
*/
public static void printArrToStr(int[] num, String text) {
StringBuilder sbr = new StringBuilder(text);
for (int i : num) {
sbr.append(i).append("\t");
}
System.out.println(sbr.toString());
}
}
参考文档地址: Java实现快速排序
讲解视频地址: 史上最详细的快速排序(快排)讲解 妈咪级快速排序讲解