def bubble_sort(alist):
"""冒泡排序"""
# 外层循环控制循环次数
for j in range(len(alist)-1):
# j [0, 1,2,...n-2]
#n-2-j
count = 0
# 内层循环控制从头走到尾的遍历
for i in range(0,len(alist)-1-j):
if alist[i]>alist[i+1]:
alist[i],alist[i+1] = alist[i+1],alist[i]
count += 1
if 0 == count:
break
if __name__ =='__main__':
li =[54,26,77,17,77,31,44,55,20]
print(li)
bubble_sort(li)
print(li)
def select_sort(alist):
"""选择排序"""
for j in range(len(alist)-1):
print("____第一个for循环第%d执行过程_____________"%j )
for i in range(j+1,len(alist)):
if alist[i] < alist[j]:
alist[i] ,alist[j] = alist[j],alist[i]
print(alist)
print("****第一个for循环执行第%d次的结果*************"%j )
print(alist)
if __name__ == '__main__':
li = [54,26,93,17,77,31,44,55,20]
print("---------------未排序的列表---------------")
print(li)
select_sort(li)
print("---------------排序后的列表----------------")
print(li)
def shell_sort(alist):
"""希尔排序"""
n = len(alist)
gap = n//2
print("gap的值为%d" %gap)
while gap >= 1:
#插入排序算法
for j in range(gap,n):
# 处理元素向前遍历插入到相应的位置上
print("j的值为%d"%j)
i = j
while (i-gap) >= 0:
if alist[i] < alist[i-gap]:
alist[i], alist[i-gap] = alist[i-gap],alist[i]
i -= gap
print("i的值为%d" %i)
else:
break
print(li)
#缩短gap间隔
gap //= 2
print("gap的值为%d" %gap)
if __name__ == '__main__':
li = [54,26,93,17,77,31,44,55,20]
print("---------------未排序的列表---------------")
print(li)
shell_sort(li)
print("---------------排序后的列表----------------")
print(li)
def quick_sort(alist, start, end):
"""快速排序"""
if start >= end:
return
mid = alist[start]
left = start
right = end
# left与right未重合,就向中间移动
while left < right:
while left < right and alist[right] >= mid:
right -= 1
alist[left] = alist[right]
while left < right and alist[left] < mid:
left += 1
alist[right] = alist[left]
# 从循环退出后,left与right相遇,即left==right
alist[left] = mid
# 对左边部分执行快速排序
quick_sort(alist, start, left-1)
# 对右边部分执行快速排序
quick_sort(alist, left+1, end)
if __name__ == '__main__':
li = [54, 26, 93, 17, 77, 31, 44, 55, 20]
print(li)
quick_sort(li, 0, len(li)-1)
print(li)
6归并排序
def merge_sort(alist):
"""归并排序"""
n = len(alist)
if 1 == n:
return alist
mid = n // 2
# 对左半部分进行归并排序
left_sorted_li = merge_sort(alist[:mid])
# 对右半部分进行归并排序
right_sorted_li = merge_sort(alist[mid:])
# 合并两个有序集合
left, right = 0, 0
merge_sorted_li = []
left_n = len(left_sorted_li)
right_n = len(right_sorted_li)
while left < left_n and right < right_n:
if left_sorted_li[left] <= right_sorted_li[right]:
merge_sorted_li.append(left_sorted_li[left])
left += 1
else:
merge_sorted_li.append(right_sorted_li[right])
right += 1
merge_sorted_li += left_sorted_li[left:]
merge_sorted_li += right_sorted_li[right:]
return merge_sorted_li
if __name__ == '__main__':
alist = [54, 26, 93, 17, 77, 31, 44, 55, 20]
print("before sort: %s" % alist)
sorted_alist = merge_sort(alist)
print("after sort: %s" % alist)
print("sorted new list: %s" % sorted_alist)