quick_sort

#基本思想[升序]

   随机找出一个数,可以随机取,也可以固定值(开始,结尾,中间)为基准,然后把比基础小
 的值放在左边,比基准大的值放在右边,然后采用此方法对两部分数据分别进行快速排序,整个
 过程可以用递归进行,以此达到整个数据排序。
 
#具体步骤:
  
    1.选择数组中的第一个元素作为基准(pivot);
    2.左指针left,从左边开始寻找第一个比pivot大的数;
    3.右指针right,从最右边开始寻找第一个比pivot小的数;
    4.经过2,3两个步骤会出现以下情况:
      a:left,right没有相遇,此时交换,swap(arr,left,right)
      b:left,right相遇,作交换swap(arr,start,left),并返回left;
    5.partition中返回pivot用于分割数据,下一次用于排序的数组被分割为
    (start,pivot-1)和(pivot+1,end),进行递归操作.

# 动图展示:

# 代码实现:
 ## python:
`def quickSort(nums):
    if (len(nums) < 2):
        return nums
    mid = nums[len(nums) // 2]
    left, right = [], []
    nums.remove(mid)
    for item in nums:
        if item > mid:
            right.append(item)
        else:
            left.append(item)
    return quickSort(left) + [mid] + quickSort(right)`

## python_NB 牛逼版本 一行代码搞定
`quick_sort = lambda array: array if len(array) <= 1 else quick_sort(
    [item for item in array[1:] if item <= array[0]]) + [array[0]] + quick_sort(
    [item for item in array[1:] if item > array[0]])`

##思考:
    如果把重复的数字去掉,应该怎么写?
    传入参数为nums行不行 为什么?

## C++:
 
  `void quick_sort(int nums[], int left, int right) {
    if (right <= left)
        return;
    int val = nums[left];/*基准值*/
    int i = left; //从左到右的索引指针
    int j = right + 1; //从右道左的索引指针
    while (true) {
        while (nums[++i] < val) {
            if (i == right)break;
        }
        while (nums[--j] > val) {
            if (j == left)break;
        }
        if (i >= j)break;
        /*交换i,j对应的值*/
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
    /*找分段后的新的基准值*/
    int temp = nums[left];
    nums[left] = nums[j];
    nums[j] = temp;
    quick_sort(nums, left, j - 1);
    quick_sort(nums, j + 1, right);
}`

## 思考:
    STL中排序算法是如何实现的?快速->[插入排序,堆排序]
    https://zhuanlan.zhihu.com/p/36274119

# 时间复杂度分析:
    https://www.zhihu.com/question/22393997/answer/406278523
    



      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值