学自B站懒猫老师, 懒猫老师-数据结构-(64)快速排序_哔哩哔哩_bilibili
快速排序,采用分而治之的思想.
原理: 首先选择一个轴值(即比较的基准), 通过一趟排序将待排序记录分割成独立的两部分,
前一部分记录的关键码小于或等于轴值, 后一部分记录关键码均大于或等于轴值, 然后分别对这两部分重复上述方法.直到整个序列有序.
问题:
1. 如何选择轴值(基准)
2. 如何实现分割
3. 如何处理分割得到的两个待排序子序列
4. 如何判断快速排序的结束
选取轴值方法有:
1. 直接选择第一个关键码
2. 随机选择关键码
3. 三分法: 比较第一个, 最后一个, 中间一个 , 取居中的作为轴值,并调换到第一个记录的位置
代码如下:
/**
* @BelongsProject: QuickSort
* @BelongsPackage: com.hua
* @Author: Mr.Hua
* @CreateTime: 2022-08-31 14:16
* @Description: TODO
* @Version: 1.0
*/
public class QuickSortPlus {
public static void main(String[] args) {
int[] arr = {45, 644, 5, 45, 35, 6, 89, 2, 63, 55};
int length = arr.length;
int[] ints = quickSortPlus(arr, 0, length - 1);
System.out.println(Arrays.toString(ints));
}
// 第一次划分 同时将基准位置找到, 左边小于等于基准, 右边大于等于基准
public static int position(int[] arr, int first, int end) {
int i, j;
i = first;
j = end;
while (i < j) {
while (i < j && arr[j] > arr[i]) {
j--;
}
// j从后往前 找到一个小于或等于arr[i]的数, 将arr[i],与arr[j] 的值进行交换 j暂停,
// i开始从前往后寻找大于等于arr[j]的数
if (i < j) {
int temp;
temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
i++;
}
while (i < j && arr[j] > arr[i]) {
i++;
}
// i找到了, arr[i]>=arr[j] 的数, 将arr[i],与arr[j] 的值进行交换, i暂停, j开始从后往
// 前 找到一个小于或等于arr[i]的数
if (i < j) {
int temp;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
j--;
}
}
// 跳出while(i<j)循环,i=j,或i>j,返回一个基准的索引
return i;
}
// 递归调用, 分治法, 无限划分, 当左右两边有序时, 整体有序
public static int[] quickSortPlus(int[] arr, int first, int end) {
if (first < end) {
int position = position(arr, first, end);
quickSortPlus(arr, first, position - 1);
quickSortPlus(arr, position + 1, end);
}
return arr;
}
}
在学习过程中,创建一个 两值, 交换的方法 , 给快速排序使用,发现一个问题
1. 对于什么是值传递, 什么是址传递, 什么是局部参数 ,什么是全局参数, 理解不够深刻
使用方法将两个数进行交换的方法有
Java基础:交换两数的方法_rainszj的博客-CSDN博客_java交换两个数的函数
1, 自定义数组变量+临时变量(推荐)
public static void swap(int[] arr) {
int temp = arr[0];
arr[0] = arr[1];
arr[1] = temp;
}
2. 数组+加减计算
public static void swap(int[] arr) {
arr[0] = arr[0] + arr[1];
arr[1] = arr[0] - arr[1];
arr[0] = arr[0] - arr[1];
}
3. 数组+异或运算(效率最高) 0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1)
public static void swap(int[] arr) {
arr[0] = arr[0] ^ arr[1];
arr[1] = arr[0] ^ arr[1];
arr[0] = arr[0] ^ arr[1];
}
- 语句 1 可以看做把变量 a、b 的值临时存储到变量 a 中(一种理解方式——
- 语句 2 利用 b ^ b == 0 消去了 b,也就是 b = a
- 语句 3 也是利用 自己异或自己等于 0,消去了 a,从而 a = b
4. 成员变量
public class SwapNumber {
int a;
int b;
public void swap(int a, int b) {
this.a = b;
this.b = a;
}
}
class SwapNumberTest {
public static void main(String[] args) {
SwapNumber obj = new SwapNumber();
obj.a = 10;
obj.b = 20;
System.out.println("交换前:a = " + obj.a + ", b = " + obj.b);
obj.swap(obj.a, obj.b);
System.out.println("交换后:a = " + obj.a + ", b = " + obj.b);
}
}