python-排序算法
程序员文章站
2022-05-26 22:26:03
...
1.插入排序(直接插入)
def insert_sort(alist): #插入排序 O(n^2) 稳定排序
length = len(alist)
for i in range(1,length):
key = alist[i]
j = i -1
while j>0:
if alist[j]>key:
alist[j+1] = alist[j]
alist[j] = key
j -= 1
return alist
2.希尔排序(插入排序的一种),分组进行插入排序
希尔排序的特点:
a.插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。
b.但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。
c.子序列的构成不是简单的“逐段分割”,而是将像个某个“增量“的记录组成一个组序列。
用下面的这张图来解释,这是数据结构书中的示例图
第一趟的增量为5,第二趟的增量为3,第三趟的增量为1
增量的选择问题:
希尔排序的原理是每次对无序序列中的数隔d(增量)进行排序,这样,对着增量的减小,序列也会越来越有序,当增量减小到1时,序列也就成有序状态了。增量不一定是奇数,事实上,增量数组的选取是一个有很深入学问的事情,一个好的增量数组,可以使算法效率达到最快,这与数据的数量和混乱程度有关,然而,只要一个数组是递减的,并且最后一个值是1,都可以作为增量数组使用,并且也能完成排序工作,但是效率上可能就低一点了,也就是说算法的复杂度要升高。
def shell_sort(lists):
# 希尔排序
length = len(lists)
step = 2
group = length / step
while group > 0:
for i in range(0, group):
j = i + group
while j < length:
k = j - group
key = lists[j]
while k >= 0:
if lists[k] > key:
lists[k + group] = lists[k]
lists[k] = key
k -= group
j += group
group /= step
return lists
3.冒泡排序
def bubble_sort(alist): # 冒泡排序 O(n^2) 稳定排序
length = len(alist)
for i in range(length):
for j in range(i+1,length):
if alist[i]>alist[j]:
alist[i],alist[j] = alist[j],alist[i]
return alist
4.快速排序
def quick_sort(alist,left,right): # 快速排序 O(nlogn) 不稳定排序
if left >= right:
return alist
low = left
high = right
key = alist[low]
while left<right:
while left<right and alist[right]>key:
right -= 1
alist[left] = alist[right]
while left<right and alist[left]<key:
left += 1
alist[right] = alist[left]
alist[left] = key
quick_sort(alist,low,left-1)
quick_sort(alist,left+1,high)
return alist
上一篇: CSS三角
下一篇: 排序算法-----冒泡排序(1)