python实现排序算法
冒泡排序(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))