快速排序算法——两种写法

写法一 伪代码:

快速排序算法:Quicksoft(A, p, r)

p,r分别为数组A的首元素和尾元素的下标
主程序直接调用Quicksort(A, 1, n)即可

输入:数组A[p..r],1≤p≤r≤n
输出:从A[p]到A[r]按照递增顺序排好序的数组A

if p<r
then q←Partition(A, p, q-1) //划分数组,找到首元素A[p]在排好序后的位置q
    A[p]←→A[q]
    Quicksort(A, p, q-1)
    Quicksort(A,q+1,r)

Partition(A, p, r)
输入:数组A[p,r]
数组:j, A的首元素在排好序的数组中的位置

x←A[p]
i←p
j←r+1
while true do
    repeat jj-1
    util A[j]≤x
    repeat ii+1
    until A[i]>x
    if i < j
     then A[i]←→A[j]
     else return j

Python实现代码:

def quicksort(ar, p, r):
    if p < r:
        q = partition(ar, p, r)
        arr[p], arr[q] = ar[q], arr[p]
        quicksort(ar, p, q - 1)
        quicksort(ar, q + 1, r)
    else:
        return


def partition(ar, p, r):
    x = ar[p]
    i = p
    j = r
    while 1:
        while ar[j] > x:
            j = j - 1
        while ar[i] <= x:
            i = i + 1
        if i < j:
            ar[i], ar[j] = ar[j], ar[i]
        else:
            return j


arr = [1, 4, 7, 1, 5, 5, 3, 85, 34, 75, 23, 75, 2, 0]

print "initial array:\n", arr
quicksort(arr, 0, len(arr) - 1)
print "result array:\n", arr
写法二 伪代码:

QUICKSORT(A, p, r)

if p<r
    q = PARTITION(A,p,r)
    QUCIKSORT(A,p,q-1)
    QUICKSORT(A,q+1,r)

PARTITION(A, p, r)

x = A[r]
i = p-1
for j=p to r-1
    if A[j]≤x
        i = i + 1
        exchange A[i] with A[j]
exchange A[i+1] with A[r]
return i+1

Python实现代码

def quicksort(ar, p, r):
    if p < r:
        q = partition(ar, p, r)
        quicksort(ar, p, q - 1)
        quicksort(ar, q + 1, r)
    else:
        return


def partition(ar, p, r):
    x = ar[r]
    i = p-1
    for j in range(p, r):
        if ar[j] <= x:
            i = i + 1
            ar[i], ar[j] = ar[j], ar[i]
    ar[i+1], ar[r] = ar[r], ar[i+1]
    print ar
    return i+1


arr = [2, 8, 7, 1, 3, 5, 6, 4]
print "initial array:\n", arr
print "***************************"
quicksort(arr, 0, len(arr) - 1)
print "***************************"
print "result array:\n", arr
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值