使用python实现了快速排序,两种策略:
1、直接选择第一个为基准值。
- #!/usr/bin/python
- #coding: UTF-8
- """
- Quick Sort.
- Author : Hegc Huang
- Time : 2008-12-21
- """
- import math
- data = [4, 9, 17, 3, 6, 8, 37, 15, 29, 18, 0, 7, 102, 34, 56, 72, -2, 5]
- count = 0
- c = 0
- def qsort (d, left, l):
- global count, c
- start = left
- base = d[left]
- right = left+1
- while right < l:
- move = d[right]
- if (base>move and left < right):
- d[right] = base
- d[left] = move
- tmp = left
- left = right
- right = tmp
- c += 1
- elif (base<move and left>right) :
- d[right] = base
- d[left] = move
- left = right
- c += 1
- right += 1
- count += 1
- print "%4d " % count, d
- if left > start+1:
- qsort(d, start, left)
- if left < l-1:
- qsort(d, left+1, l)
- qsort(data, 0, len(data))
- print u"排序结果:", data
- print u"预计比较次数", len(data)*math.log10(len(data))
- print u"实际比较次数:", c
2、在每次的数组序列中随机挑选一个作为基准值:
- #!/usr/bin/python
- #coding: UTF-8
- """
- Quick Sort with Random Selection.
- Author : Hegc Huang
- Time : 2008-12-21
- """
- import math
- import random
- import time
- data = [4, 9, 17, 3, 6, 8, 37, 15, 29, 18, 0, 7, 102, 34, 56, 72, -2, 5]
- count = 0
- c = 0
- def qsort (d, left, le):
- global count, c
- start = left
- random.seed(time.time())
- left = random.randrange(left, le)
- base = d[left]
- right = start
- while right < le:
- move = d[right]
- if (base>move and left < right):
- d[right] = base
- d[left] = move
- tmp = left
- left = right
- right = tmp
- c += 1
- elif (base<move and left>right):
- d[right] = base
- d[left] = move
- left = right
- c += 1
- right += 1
- count += 1
- print "%4d " % count, d
- if left > start+1:
- qsort(d, start, left)
- if left < le-1:
- qsort(d, left+1, le)
- qsort(data, 0, len(data))
- print u"排序结果:", data
- print u"预计比较次数", len(data)*math.log10(len(data))
- print u"实际比较次数:", c
rel="File-List" href="file:///C:%5CDOCUME%7E1%5CIBM%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C03%5Cclip_filelist.xml">这两种方法对于同一个序列[4, 9, 17, 3, 6, 8, 37,
15, 29, 18, 0, 7, 102, 34, 56, 72, -2, 5](18个数字)的测试情况为:
第一种方法:进入qsort()方法13次,比较交换了36次。
第二种方法:结果如下,第一列是序号,第儿列是进入qsort的次数,最后是对应的比较交换的次数。
rel="File-List" href="file:///C:%5CDOCUME%7E1%5CIBM%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C07%5Cclip_filelist.xml">
1 |
15 |
24 |
2 |
16 |
38 |
3 |
14 |
40 |
4 |
15 |
36 |
5 |
16 |
44 |
6 |
15 |
30 |
7 |
12 |
34 |
8 |
16 |
36 |
9 |
17 |
42 |
10 |
16 |
46 |
11 |
15 |
34 |
12 |
14 |
24 |
13 |
14 |
28 |
14 |
15 |
40 |
15 |
16 |
30 |
16 |
12 |
40 |
17 |
13 |
22 |
18 |
13 |
32 |
19 |
15 |
24 |
20 |
13 |
30 |
最后的平均水平是进入qsort函数14.6次,比较交换了33.7次,与第一种方法的结果差别不大,而且稳定性差,最好的时候比较交换22次,最坏的时候46次。