冒泡排序(Bubble Sort)
"""
冒泡排序:让子序列中的最大元素不断沉底,达到排序的目的。
冒泡排序一共经过N-1次遍历,其中第i次遍历前N-i个元素(第i+1到N个元素已经排序完毕),将第i大的元素移动到N-i的位置
"""
lists = [2, 4, 1, 3, 0, 100, 23, 60]
for i in range(len(lists) - 1):
for j in range(0, len(lists) - i - 1):
lists[j], lists[j + 1] = min(lists[j], lists[j + 1]), max(lists[j], lists[j + 1])
# 优化
# 如果进行某一趟排序时并没有进行数据交换,则说明所有数据已经有序,可立即结束排序,避免不必要的比较过程
for i in range(len(lists) - 1):
flag = False
for j in range(len(lists) - 1 ,i,-1):
if lists[j] < lists[j - 1]:
flag = True
lists[j],lists[j-1] = lists[j-1],lists[j]
if not flag:
break
print(lists)
选择排序(Selection Sort)
# 选择排序,每次选择一个最小的放在当前未排序序列的首位
lists = [2, 4, 1, 3, 0, 100, 23, 60]
def selection_sort(li):
for i in range(len(li)):
index = li.index(min(li[i:])) # 存储最小元素的位置,否则再次查找列表已经改变
li[i], li[index] = li[index],li[i]
print(li)
selection_sort(lists)
插入排序(Insertion Sort)
# 通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
arr = [1, 12, 2, 11, 13, 5, 6, 18, 4, 9, -5, 3, 11]
def insertsort(arr):
for i in range(1, len(arr)):
j = i
while j > 0:
if arr[j] < arr[j - 1]:
arr[j], arr[j - 1] = arr[j - 1], arr[j]
j -= 1
return arr
print(insertsort(arr))
快速排序(Quick Sort)
快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为较小和较大的2个子序列,然后递归地排序两个子序列。
步骤为:
挑选基准值:从数列中挑出一个元素,称为"基准"(pivot);
分割:重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(与基准值相等的数可以到任何一边)。在这个分割结束之后,对基准值的排序就已经完成;
递归排序子序列:递归地将小于基准值元素的子序列和大于基准值元素的子序列排序。
arrx = [1, 12, 2, 11, 13, 5, 6, 18, 4, 2,9, -5, 3, 11]
def quick_sort(arr):
if len(arr) < 2:
return arr
else:
pivot = arr[0]
small_arr = [i for i in arr[1:] if i < pivot]
big_arr = [i for i in arr[1:] if i >= pivot]
return quick_sort(small_arr) + [pivot] + quick_sort(big_arr)
print(quick_sort(arrx))