快速排序算法总结

本文详细介绍了快速排序算法,基于分治思想,通过基准元素划分数组,时间复杂度为O(nlog2n),并提供了Java代码示例,展示了算法的拆东墙补西墙过程。
摘要由CSDN通过智能技术生成

快速排序算法思想

快速排序采用了分治的思想,其时间复杂度为 O ( n l o g 2 n ) O(nlog_2n) O(nlog2n).
快速排序是一种不稳定的排序。

基本步骤

  1. 找一个基准(pivot)。一般是第一个,但是更合理的是数组中的一个随机元素。
  2. 重新排序数组。将比基准小的放在基准左侧,将比基准大的放在基准右侧。排序完成后,该基准处于序列的中间,称为分区(partition)。
  3. 接下来,递归地对分区两边的部分进行上述操作,最终完成排序。

代码

public static void quickSort(int[] nums, int start, int end) {
        // 当 start = end时,只有一个元素不需要排序
        if (start < end) {
            int base = nums[start];
            int low = start;
            int high = end;
            // 循环找比标准数大的数和比标准数小的数
            while (low < high) {
                //右边的数字比标准数大
                while (low < high && nums[high] >= base) {
                    high--;
                }
                //上述循环结束后,high的位置一定比base小,将这个数放在low的位置。
                nums[low] = nums[high];
                //左边的数比标准数小
                while (low < high && nums[low] <= base) {
                    low++;
                }
                // 上述循环结束后,low的位置一定比base大,将这个数放在high的位置。
                nums[high] = nums[low];
            }
            nums[low] = base;
            quickSort(nums,start,low-1);
            quickSort(nums,low+1,end);
        }
    }

算法模拟过程像是拆东墙补西墙的感觉,首先使用开头的数作为基准,也就是low位置的数,然后从右侧找到第一个比pivot小的数,其indexhigh,将nums[high]放在nums[low]的位置,然后再从左侧找到第一个比pivot 大的数,其indexlow,将nums[low]放在nums[high]的位置。依次这样循环,直到 lowhigh相等。 最后将base(pivot)放在low/high位置,就完成了一次分区。接着对左右部分分别递归排序即可。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值