#coding:utf-8
"""
[1]. http://www.cnblogs.com/eniac12/p/5329396.html
"""
def bubble_sort(para_list, ordered = True):
'''
冒泡排序
原理:依次重复访问每一个需要排序的元素,每次比较相邻的两个元素是否符合顺序,若不符合就交换,直到没有不符合顺序的为止。
分类 -------------- 内部比较排序
数据结构 ---------- 数组
最差时间复杂度 ---- O(n^2)
最优时间复杂度 ---- 如果能在内部循环第一次运行时,使用一个旗标来表示有无需要交换的可能,可以把最优时间复杂度降低到O(n)
平均时间复杂度 ---- O(n^2)
所需辅助空间 ------ O(1)
稳定性 ------------ 稳定
'''
len_para_list = len(para_list)
assert len_para_list >= 2
for i in range(len_para_list - 1, 0, -1):
for j in range(i):
if para_list[j] > para_list[j + 1] and ordered:
para_list[j], para_list[j + 1] = para_list[j + 1], para_list[j]
elif para_list[j] < para_list[j + 1] and not ordered:
para_list[j], para_list[j + 1] = para_list[j + 1], para_list[j]
return para_list
def selection_sort(para_list):
'''
选择排序
原理:将序列逻辑上分为已排序序列和未排序序列,在未排序序列中找到最小(大)值,放置到已排序序列的起始(终止)位置,
之后继续在剩余未排序的序列元素中寻找最小(大)元素,反知道已排序序列的起始(终止)位置,依次类推,直至排序完成。
分类 -------------- 内部比较排序
数据结构 ---------- 数组
最差时间复杂度 ---- O(n^2)
最优时间复杂度 ---- O(n^2)
平均时间复杂度 ---- O(n^2)
所需辅助空间 ------ O(1)
稳定性 ------------ 不稳定
关于冒泡排序和选择排序的区别可以参考http://www.cnblogs.com/banana201/p/4928733.html
:param para_list:
:return:
'''
para_list_len = len(para_list)
for i in range(0, para_list_len):
pos_min = i
for j in range(i + 1, para_list_len):
if para_list[pos_min] > para_list[j]:
pos_min = j
para_list[i], para_list[pos_min] = para_list[pos_min], para_list[i]
if __name__ == '__main__':
# import numpy as np
# arr = np.array([1,2,4,5,3,7,2,1,9])
# arr_order = bubble_sort(arr, False)
# print arr_order
alist = [54, 15, 45, 10, 77, 31, 44, 55, 20]
selection_sort(alist)
print(alist)
[1]. http://www.cnblogs.com/eniac12/p/5329396.html