图解快排

快排的两个重要思想

1. 找到分界点,两边进行排序
2. 原地排序

我们遍历 p 到 r 之间的数据,将小于 pivot 的放到左边,将大于 pivot 的放到右边,将 pivot 放到中间。经过这一步骤之后,数组 p 到 r 之间的数据就被分成了三个部分,前面 p 到 q-1 之间都是小于 pivot 的,中间是 pivot,后面的 q+1 到 r 之间是大于 pivot 的。
在这里插入图片描述
原地排序
在这里插入图片描述
完整代码

class Solution {
public:
    void sortColors(vector<int>& nums) {
        quik_sort(0,nums.size()-1,nums);
    }
    // 快排
    void quik_sort(int p,int r, vector<int>& nums) {
        if(p>=r) return;
        int q=partition(p,r,nums);
        quik_sort(p,q-1,nums);
        quik_sort(q+1,r,nums);
    }

    int partition(int p,int r,vector<int>& nums) {
        // 函数作用是排序分成大于一部分和小于一部分
        int pivot=nums[r];
        int i=p;
        for(int j=p;j<r;j++) {
            if(nums[j]<pivot){
                swap(nums[i],nums[j]);
                i++;
            }
        }
        swap(nums[i],nums[r]);
        for(auto value: nums)
        cout<<value<<" ";
        cout<<endl;
          cout<<i<<endl;
        return i;
      
    }
};
### Python 实现快速排序算法 快速排序是一种基于分治法的高效排序算法,其核心思想是通过选取一个基准值(pivot),将数组划分为左右两个子数组,其中左侧子数组中的所有元素均小于基准值,右侧子数组中的所有元素均大于或等于基准值。随后递归地对左右子数组执行相同的操作,直至整个数组有序。 以下是快速排序的具体实现方法: #### 基本原理 快速排序的核心在于选择一个基准值并完成分区操作。通常可以选择数组的第一个元素作为基准值[^2]。接着按照以下逻辑处理数据: - 将数组中小于基准值的部分放入左子数组; - 大于或等于基准值的部分放入右子数组; - 对左右子数组分别递归调用快速排序函数。 当递归结束时,合并结果即为完整的排序序列。 #### 图解说明 假设有一个未排序列表 `[3, 6, 8, 10, 1, 2, 1]`,我们可以通过如下步骤对其进行排序: 1. 初始状态:选取第一个元素 `3` 作为基准值。 2. 遍历剩余元素并将它们分配到左子数组 `[1, 2, 1]` 和右子数组 `[6, 8, 10]` 中。 3. 对左子数组和右子数组分别重复上述过程,直到无法继续分割为止。 4. 合并所有的子数组以及中间的基准值形成最终的结果。 #### Py代码实现 下面是一个标准的 Python 版本的快速排序实现: ```python def quick_sort(arr): if len(arr) <= 1: # 如果数组长度为0或者1,则无需进一步排序 return arr else: pivot = arr[0] # 取第一个元素作为基准值 less_than_pivot = [x for x in arr[1:] if x < pivot] # 左侧子数组 greater_or_equal_to_pivot = [x for x in arr[1:] if x >= pivot] # 右侧子数组 # 递归调用并对两侧子数组进行排序后再拼接起来 return quick_sort(less_than_pivot) + [pivot] + quick_sort(greater_or_equal_to_pivot) # 测试代码 if __name__ == "__main__": test_array = [3, 6, 8, 10, 1, 2, 1] sorted_array = quick_sort(test_array) print(sorted_array) ``` 此段程序展示了如何利用列表推导式来简化分区的过程,并且保持了代码的高度可读性和简洁性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值