用python写选择排序本身没有太大的意义,本人只是想借此机会再多接触一下python;
代码写起来也是臃肿不堪,其实直接调用list.sort( )
从效率上,代码的简洁程度上肯定都更好。
- 先看代码
# 选择排序代码
def selection_sort(alist):
for index, x in enumerate(alist):
min_index = index
for index2, x2 in enumerate(alist[index:]):
if alist[index2+index] < alist[min_index]:
min_index = index2+index
alist[index], alist[min_index] = alist[min_index], alist[index]
# 排序计时辅助类
from random import randint
import time
class SortTestHelper:
def __init__(self, count, range_l, range_r, verbose=False):
self.verbose = verbose
self.count = count
self.range_l = range_l
self.range_r = range_r
self.list = self.__generate_random_list()
def __enter__(self):
self.start = time.time()
def __exit__(self, *args):
self.end = time.time()
self.secs = self.end - self.start
self.msecs = self.secs * 1000 # milliseconds
assert self.is_sorted()
if self.verbose:
print('elapsed time: %s ms' % self.msecs)
else:
print('elapsed time: %s s' % self.secs)
def __generate_random_list(self):
return [randint(self.range_l, self.range_r) for _ in range(0, self.count)]
def is_sorted(self):
for index, x in enumerate(self.list[:-1]):
if self.list[index] > self.list[index+1]:
return False
return True
# 主函数
from selection_sort import selection_sort
from sort_test_helper import SortTestHelper
count = 1000
if __name__ == '__main__':
st = SortTestHelper(count, 0, count)
# 计算运行时间方法一
with st as t:
selection_sort(st.list)
with st as t:
st.list.sort()
# 计算运行时间方法二
# from time import clock
#
# start = clock()
# selection_sort(tlist)
# finish = clock()
# print("{:<20}{:10.6} s".format(selection_sort.__name__ + ":", finish - start))
#
# start = clock()
# tlist.sort()
# finish = clock()
# print("{:<20}{:10.6} s".format("built_in sort" + ":", finish - start))
-
总结
- python中的
for
循环:- python 中的没有类似c语言中的
for(;;)
的方式,只有 for in - 本例中采用的方式是
for index, x in enumerate(alist):
- enumerate 就是遍历list并且返回index的方法,可以实现类似c语言的表达方式
- 内层循环中需要注意的点就是:
alist[index:]
切片的方式 ==》for ( int j = i; i < n; ++i)
- python中交换两个数:
a, b = b, a
- 内层循环中的一些边界问题也是值得注意的
- python 中的没有类似c语言中的
- 排序计时类:
-
staticmethod
不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样 -
for (int i = 0; i < n-1; ++i)
==> python中的表达方式for index, x in enumerate(a_list[:-1]):
- 依据
__enter__
和__exit__
方法,再结合with
方法可以优雅的写出计时方法类,计算耗时上也会更精准 - 也可以使用
clock( )
函数,计算函数调用的时间, 或者如本例中给出的time()
- 随机数组:这个实现手段也是比较经典的做法了
[randint(range_l, range_r) for _ in range(0, count)]
- 格式化输出:
print("{:<20}{:10.6} s".format("built_in sort" + ":", finish - start))
,这也是format
使用的一些高级用 法(使用:
),也是python强大之处的一个体现,这里的作用主要是实现文本输出的宽度:函数名长度不超过20个字符,时间长度为10,保留6位小数
- python中的
- 内置
sort
函数- 效率没得说,比自己写的肯定好太多。。
-
list.sort()
方法是会修改原list的,类似的还有list.reverse()
方法, - 不会修改原list,生成新的list的方法是:
sorted() 和 reversed()
方法