使用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次。