通俗易懂理解快速排序

快速排序

原理

在数组中以任意一个数据作为分区点,比分区点的放到分区点右边,比分区点小的放分区点左边,递归的继续为左右分区进行相同操作,直至每个区间缩小为1。

时间复杂度:O(nlogn)

代码与注释

public class TestSort {
    public static void main(String[] args) {
        int[] arr = {9,8,7,6,5,4,3,2,1};
        customQuickSort(arr,0,arr.length-1);
        print(arr,"快速排序");
    }
public static void print(int[] arr,String s){
        System.out.print(s+":");
        for (int i : arr) {
            System.out.print(i+" ");
        }
        System.out.println();
    }

public static void customQuickSort(int[] arr, int low, int high){
        int i,j,temp,t;  // 定义左右指针, temp 用作分区点,t用作与分区点与指针重合交换的变量
        if (low > high){
            return;
        }
        i = low;  // 左边界
        j = high; // 右边界
        temp = arr[low]; // 分区点
        while (i<j){
            while (temp<=arr[j]&&i<j){  // 分区点右边指针指向数组的值大于分区点,指针左移
                j--;
            }

            while (temp>=arr[i]&&i<j){ //分区点左边指针指向数组的值小于分区点,指针右移
                i++;
            }
            // 上面两个循环判断完后,即i 指针与 j 指针指向的数据都分别大于分区点和小于分区点,然后将两个指针指向的数据进行交换
            t = arr[j];
            arr[j] = arr[i];
            arr[i] = t;
            // 进行下一次循环,判断 两个指针是否相遇,相遇就停止
        }
        // 将分区点与i=j的数组数据进行交换
        arr[low] = arr[i];
        arr[i] = temp;
        // 分组 然后进行排序,此时的j为上一个分区点
        customQuickSort(arr,low,j-1); // 左子组
        customQuickSort(arr,j+1,high); // 右子组
    }
}

总结

  1. 定义两个左右指针
  2. 定义两个临时变量,一个用作分界点,一个用作左右指针指向的数据交换
  3. 定义一个循环,当左右指针相等时,交换指针指向的数据与分界点
  4. 第一个循环内部再定义两个循环,一右指针大于分界点左移,二左指针小于分界点右移
  5. 递归排序分界点左边分区,递归排序分界点右边分区
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值