快速排序算法及python代码实现

快速排序算法:快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。
假设要排序的序列为

2 2 4 9 3 6 7 1 5 首先用2当作基准,使用i j两个指针分别从两边进行扫描,把比2小的元素和比2大的元素分开。首先比较2和5,5比2大,j左移

2 2 4 9 3 6 7 1 5 比较2和1,1小于2,所以把1放在2的位置

2 1 4 9 3 6 7 1 5 比较2和4,4大于2,因此将4移动到后面

2 1 4 9 3 6 7 4 5 比较2和7,2和6,2和3,2和9,全部大于2,满足条件,因此不变

经过第一轮的快速排序,元素变为下面的样子

[1] 2 [4 9 3 6 7 5]

之后,在把2左边的元素进行快排,由于只有一个元素,因此快排结束。右边进行快排,递归进行,最终生成最后的结果。

#!/usr/bin/python env
# -*- coding:utf-8 -*- 

import random
import time

count = 0
def quick_sort(array, left, right):
    # print 'to be sorted array is:', array
    global count
    count += 1
    # print 'count is :', count
    # print 'left -->> right are :', left, right
    # print array[left:right + 1]

    low = left
    high = right
    while left >= right:
        return

    key = array[left]
    while low < high:

        # k = array[]
        while low < high and  array[high] > key:
            high -= 1
        temp = array[high]
        array[high] = array[low]
        array[low] = temp

        # array[high] = array[low]
        # array[low] = key

        while  low < high and array[low] <= key:
            low += 1
        temp = array[low]
        array[low] = array[high]
        array[high] = temp
        # array[high] = array[low]
        # array[low] = key
    # print '*************', array

    quick_sort(array, left, low - 1)
    quick_sort(array, low + 1, right)

if __name__ =='__main__':
    array = []
    # array = [11, 35, 81, 86, 12, 85, 11, 22, 9, 14]
    # array = [6, 77, 67, 8, 6, 64]
    print len(array) -1
    for i in range(10000):
        array.append(random.randrange(9999))
    print array
    start_time = time.time()
    quick_sort(array, 0, len(array) - 1)
    end_time = time.time()
    print '&&&&&&&&&&&&&&&&&&&&&&&&&&&'
    print 'count is:', count
    print 'time spend is: %f', end_time - start_time
    print array
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值