快速排序

本文深入解析了快速排序算法,一种高效的比较排序方法。介绍了快速排序的基本思想:通过选取基准数,将数组分为左右两部分,左边元素小于基准数,右边元素大于基准数,然后递归地对左右两边进行相同操作。文章详细解释了快速排序的实现过程,包括选择基准数、调整数组顺序以及递归排序等关键步骤。并讨论了快速排序的时间复杂度,指出在数据无序程度高时,快速排序效率更优。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快速排序

快速排序和冒泡排序一样, 都属于比较排序。
快速排序的基本思想是: 选一个数,将比它小的都放左边, 比它大的放右边再循环其左边和右边的操作

  • 按某规则(这里选择第一个数)选取一个数作基准数(即, 中间数mid)
  • 依次从后往前找一个比mid小的放前面, 再从前往后找一个比mid大的放后面
  • 重复上一步操作, 直到找完整个数组(即, 前后指针相遇)
  • 依次对mid前的部分后mid后的部分进行相同的递归操作
    对于无序程度越大的序列, 快速排序的效率越好, 时间复杂度O(n logn), 但是如果待排序序列基本上是有序的(个别乱序), 快速排序的效率会非常差, 甚至可能会不如冒泡排序
public class QuickSort {
    public static void main(String[] args) {
        int[] arr = new int[] {3, 7, 1, 12, 21, 43, 29, 9, 18};
        sort(arr);
        for(int a: arr) {
            System.out.print(a + " ");
        }
    }

    public static void sort(int[] arr) {
        sort(arr, 0, arr.length - 1);
    }
    /**
     * 快速排序(递归方法)
     * @param arr   数组
     * @param start 起始位置
     * @param end   结束位置
     */
    public static void sort(int[] arr, int start, int end) {
        if(start < end) {   // 迭代出口
            int low = start, high = end;
            int mid = arr[low]; // 简单使用start作基准值
            while(low < high) { // 每一步都需要检查 low < high
                while(arr[high] > mid) {
                    high--;     // 从后往前找比mid小的数
                }
                if(low < high) {
                    arr[low++] = arr[high]; // 把比mid小的数放前面
                }
                while(low < high && arr[low] < mid) {
                    low++;      // 从前往后找比mid大的数
                }
                if(low < high) {
                    arr[high--] = arr[low]; // 把比mid大的数放后面
                }
            }
            arr[low] = mid;     // 此时low,high相遇
            sort(arr, start, low - 1);  // 对左边排序
            sort(arr, low + 1, end);    // 对右边排序
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值