快速排序的理解

学自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);
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值