最近在学习Python, 想随便 写一下,Python 写一些 排序, 排序 算法 那么多,我也不一一介绍,写几个比较简单的,冒泡,选择,快排,插入排序
用 Python 实现一下,当然 也有参考 网上的写法, 相互学习吧,直接进入正题
1 冒泡排序
冒泡排序 思想 我想大家 都应该理解就是 相邻 两个key 进行比较, 一趟排完后,肯定有一个最值 排到第一个或最后一个位置, 之后 继续这样排,最终排完。
# coding=utf-8
#冒泡排序的实现
'''''交换排序—冒泡排序(Bubble Sort)'''
def bubble_sort(array):
length=len(array)
for i in range(length-1):
for j in range(length-1):
if array[j]>array[j+1]:
array[j],array[j+1]=array[j+1],array[j]
return array
if __name__ == '__main__':
mylist=[1,34,6,21,98,31,7,4,36,16,47,67,37,25,2]
print(bubble_sort(mylist))
2 选择排序 :
最基本 的思想,每次 从 待排序列 选择一个最值 ,放在 第一个位置, 之后 在从剩下的 待排序列中选择 一个最大值 放在 第二个位置, 依次类推
# coding=utf-8
'''
选择排序 实现Python
'''
def select_sort(array):
length=len(array)
for i in range(0,length):
k = i # 寻找最小元素的下标
for j in range(i+1, length):
if array[j] < array[k]:
k = j
# 找到最小的一个下标,并且和 array[i],交换值,这样array[i],就是最小值
array[i], array[k] = array[k], array[i]
return array
if __name__ == '__main__':
mylist=[1,34,6,21,98,31,7,4,27,13,36,47,67,37,25,2]
# mylist = [3, 5, 4, 2, 1, 6]
print (select_sort(mylist))
3 插入排序
插入排序 , 也是类似, 基本思想, 将序列 分为已经排,未排序, 从未排序列中 依次插入到 已排序列中, 这里 就要注意 如何寻找 恰当的位置,然后 进行 插入。 我这里写的方法, 拿未排的序列的一个值 ,和 已排 序列的最后一个值进行比较,如果已排序列 较大,交换两个值。 之后 继续向前比较,如果 还是大,继续交换,如果不大了,证明已经找到了正确的位置,直接break 出来,开始下一个关键字的排序 ,即可。 看一下 实现:
# coding=utf-8
'''
@author:chang
插入排序 insert_sort
'''
# 直接插入排序
def insert_sort(array):
# 遍历数组中的所有元素,其中0号索引元素默认已排序,因此从1开始
# x 为待排序列,从下标1开始取值,默认下标0是排好的。
for x in range(1, len(array)):
# 将该元素与已排序好的前序数组依次比较,如果该元素小,则交换
# range(x-1,-1,-1):从x-1倒序循环到0 x-1 x-2 x-3 --> 0
for i in range(x-1, -1, -1):
# 判断:如果符合条件则交换
if array[i] > array[i+1]:
array[i], array[i+1] = array[i+1], array[i]
else:
break
return array
if __name__ == '__main__':
# mylists = [8,10,9,6,4,16,5,13,26,18,2,45,34,23,1,7,3]
# mylists = [1, 34, 6, 21, 98, 31, 7, 4, 56, 59, 27, 13, 36, 47, 67, 37, 25, 2]
mylists = [1, 4, 7, 1, 5, 25, 3, 85, 34, 75, 23, 75, 2, 0]
print(insert_sort(mylists))
4 快速排序
快速排序, 这个 稍微有点复杂 ,只要理解 partition, 和递归 的概念, 就很容易理解了, 其实 把一个待排序列分成两组,首先 选一个key 作为基准点,通过partition 把 前面的key,都小于 基准点, 后面的都大于基准点, 这样 就是一个partition的过程。最后 partition要返回一个位置,就是 就保证了 上面说的 那个特点,前面的小于基准点,后面的大于基准点。
这样之后, 对前面的一段待排 序列, 在进行 partition,后面的一段 也在进行partition,一直到待排序列长度 为1 , 这样就全部排完了。
# coding=utf-8
'''
@author:chang
快速排序 实现
quick_sort
'''
def partition(array,low,high):
#基准点定位为第一个元素
point = array[low]
while low < high:
#将大于基准点的数放于基准点的右边
while low < high and array[high] >= point:
#移到前一个元素
high = high - 1
#当不满足大于基准点,交换基准点
array[low],array[high] = array[high],array[low]
while low < high and array[low] < point:
low = low + 1
#当不满足小于基准点,交换基准点
array[low], array[high] = array[high], array[low]
#返回枢轴的位置。。。重要
return low
#外层函数,由于快速排序需要三个参数,为零满足只要两个参数,定义一个外层函数调用实际操作的函数
def quick_sort(array,length):
q_sort(array,0,length-1)
def q_sort(array,low,high):
if low < high:
point = partition(array,low,high)
q_sort(array,low,point-1)
q_sort(array,point+1,high)
if __name__ == '__main__':
mylists = [8,10,9,6,4,16,5,13,26,18,2,45,34,23,1,7,3]
quick_sort(mylists,len(mylists))
print (mylists)
总结: 本文 主要写了 Python 实现 冒泡,选择,快速排序,简单插入排序最简单的算法。如果有发现错误,欢迎一起讨论交流。
参考文档:
http://blog.csdn.net/u013719780/article/details/49201143
分享快乐,留住感动 。 如果喜欢可以点赞哦。 2017年 10月 13日 星期五 12:31:11 ---biaoge