Leetcode刷题-马士兵课程笔记
排序算法
1.选择排序
思路:依次遍历,找到当前未被排序的序列中的最小值,放在最前边,直到所有数都按照顺序排列
def SelectionSort(arr): for i in range(len(arr)): minPos = i for j in range(i + 1, len(arr)): # minPos在一次循环中不断更新,要找到在未被排序的数中的最小值所在的位置(只要arr[j] < arr[minPos],则minPos就会更新为j) # 利用minPos指针找到最小值对应的j后,与i位置交换顺序 # 注意:每一轮minPos都会更新为新的i if arr[j] < arr[minPos]: minPos = j arr[i], arr[minPos] = arr[minPos], arr[i]
改进:每一次内层循环,找到最大值和最小值,最小值放前边,最大值放后边
# 选择排序改进:最小值放左边,最大值放右边 def SelectionSort2(arr): for i in range(len(arr) // 2): minPos = i maxPos = len(arr) - i - 1 for j in range(minPos, maxPos + 1): if arr[j] > arr[maxPos]: maxPos = j if arr[j] < arr[minPos]: minPos = j # 最大值在最前边 and 最小值在最后边 if (maxPos == i) and (minPos == len(arr) - i - 1): arr[maxPos], arr[minPos] = arr[minPos], arr[maxPos] # 最大值在最前边 elif maxPos == i: arr[maxPos], arr[len(arr) - i - 1] = arr[len(arr) - i - 1], arr[maxPos] arr[i], arr[minPos] = arr[minPos], arr[i] # 最小值在最后边 elif minPos == len(arr) - i - 1: arr[i], arr[minPos] = arr[minPos], arr[i] arr[len(arr) - i - 1], arr[maxPos] = arr[maxPos], arr[len(arr) - i - 1] # 其他情况 else: arr[i], arr[minPos] = arr[minPos], arr[i] arr[len(arr) - i - 1], arr[maxPos] = arr[maxPos], arr[len(arr) - i - 1]
2.冒泡排序
思路:每一次从未被排序的数组的第一个数字开始,依次比较前后两个数的大小,将较大的留在后边,直到所有数字都到了正确的位置。
def BubbleSort(arr): # 需要循环len次,保证每一个数都会经历一次比较大小--交换位置的过程 for i in range(len(arr) - 1, 0, - 1): # 经过一次内层循环,一个数会被移动到应该在的位置 for j in range(0, i, 1): if arr[j] > arr[j + 1]: arr[j], arr[j + 1] = arr[j + 1], arr[j]
3.插入排序
思路:从第二个位置开始,和前边的数比较,若该数小于前边的值,插入到前边的位置;依次到第3个位置、第4个位置
插入排序比冒泡排序快一倍多:插入排序不用每次都交换次序,而冒泡排序是要依次和后边的数比较大小并交换顺序