算法训练营(一):快速排序

#/usr/bin/python
#coding:utf8

import random
import time
import copy


testlist = [6,1,2,7,9,3,4,5,10,8]
testlist = [6,1,2,7,9,3,4,5,10,8,2,11,8,1,13,2,6,1,8,0,4,2,3,7,9]
testlist = []
for i in range(10000):
    num = random.randint(0,10000)
    testlist.append(num)
testlist2 = copy.deepcopy(testlist)


def quicksort(start, end):
    i = start
    j = end
	
	#第一步,设置一个哨兵。
    pivot = testlist[start]
    #第二步,前后的数据分别与哨兵进行对比,进行置换,最后结果是使左边的都小于哨兵值,右边都大于哨兵值。
    while i < j:
    	#j从最后一个位置开始向前查找,找到一个比哨兵小的元素.
        if testlist[j] < pivot:
            if testlist[i] > pivot:
                testlist[j], testlist[i] = testlist[i], testlist[j]
            #i从第一个位置开始向后查找,找到一个比哨兵大的元素.
            else:
                i =  i + 1
        #j从最后一个位置开始向前查找,找到一个比哨兵小的元素.
        else:
            j = j - 1
    #最后当i < j 不在成立,可以把哨兵与j进行交换,这样哨兵就在数列的中间位置,前边都比哨兵值小,后边都比哨兵值大.
    testlist[j], testlist[start] = testlist[start], testlist[j]
    #只要start比i大说明小于哨兵的一边没有排序完成,需要继续对比,重复上述过程。
    if start < i:
        quicksort(start, i-1)
    #只要end>j 说明大于哨兵的一边没有对比完成,需要继续对比,重复上述过程。
    if end > j:
        quicksort(j+1, end)
    return 0


#冒泡排序
def bubbleSort():
    for i in range(len(testlist2)-1):
        for j in range(i,len(testlist2)):
            if testlist2[i] > testlist2[j]:
                testlist2[i], testlist2[j] = testlist2[j], testlist2[i]


if __name__ == '__main__':
    start = time.time()
    quicksort(0, len(testlist)-1)
    end = time.time()
    #print testlist
    print end-start
    start = time.time()
    bubbleSort()
    end = time.time()
    #print testlist2
    print end-start

执行的结果如下:

➜  quicksort python sort.py
0.0577049255371
12.5943760872

结论:
在大量数据的情况下:10000个随机数据的情况下,快排要比最普通的冒泡排序快乐将近280倍。

猜你喜欢

转载自blog.csdn.net/yrx0619/article/details/83185159