[Algorithmic Toolbox学习笔记][week4]Quick Sort

Quick Sort是如何工作的?

第一步:划分数列

  • 我们需要把给出的数列划分成如下排序(以某个数为基准,将小于等于这个数的数全部放在左侧,将大于这个数的数全部放在右侧)。

 

第二步:针对每次划分后的“左侧数组”和“右侧数组”,我们再次进行步骤1中的操作,直到数组中只有一个数字

如何将数列划分成步骤1中的样子?

  • 首先我们可以先假设数列中的第一个数是那个中间数(当然你也可以假设最后一个数为中间数或任何一个位置的数都可以),然后用剩余的数依次与它进行比较。注:中间数我们常用pivot代指。图中绿色区域表示小于中间数的数,红色部分表示大于中间数的数。

  • 如果w的值小于a,那么我们需要把w加到绿色区域的尾巴上。即调换w和红色区域第一个数的位置。

  • 如果w的值大于于a,那么我们不需要调换位置,直接把w加在红色区域尾巴上即可。 

  • 然后我们再把下一个位置上的w和a进行比较,重复上面的操作。

  • 当所有数字的比较完成后我们会得到下图中第一行的数列。那么为了把a放到两个阵营的中间,我们只需要把a和绿色区域数字中的最后一个进行对调,对调后我们就获得了我们的目标数列,同时我们也知道a的索引位置。

 

Quick Sort的代码实现

代码逻辑说明:

# in python3
# 假设第一个数为中间数来进行比较
def quick_sort(arr,low,high):
    if low >= high:
        return
    pi = partition(arr, low, high)

    quick_sort(arr, low, pi-1)
    quick_sort(arr, pi+1, high)

def partition(arr, low, high):
    pivot = arr[low]
    j = low

    for i in range(low+1,high+1):
        # if current element is smaller
        if arr[i] <= pivot:
            j += 1
            arr[j],arr[i] = arr[i],arr[j]
    arr[low],arr[j] = arr[j],arr[low]
    return j


list = [7, 5, 3, 8, 4, 9]
n = len(list)
quick_sort(list,0,n-1)
print (list)
# in python
# 假设最后一个数为中间数来进行比较
def quick_sort(arr,low,high):
    if low >= high:
        return
    pi = partition(arr, low, high)

    quick_sort(arr, low, pi-1)
    quick_sort(arr, pi+1, high)

def partition(arr,low,high):
    j = ( low-1 )
    pivot = arr[high] # pivot element
    for i in range(low , high):
      # If current element is smaller
      if arr[i] <= pivot:
         # increment
         j = j+1
         arr[j],arr[i] = arr[i],arr[j]

    arr[j+1],arr[high] = arr[high],arr[j+1]
    return ( j+1 )

list = [7, 5, 3, 8, 4, 9]
n = len(list)
quick_sort(list,0,n-1)
print (list)

补充举例:

 

将pivot的位置同j进行对调是因为我们需要把pivot放在两个阵营的中间,而j是所有小于pivot的数的最后一位,因此将pivot的位置和j对调后其最新的位置就是在两个阵营中间了。

重复排序操作,直到新数列(需要排序的数列)中只剩下一位数字。

Quick Sort的运行速度

运行速度取决于做比较的次数

Worst case runing time is O(n^2)

Ideal case running time is O(n * \log n)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值