1、冒泡排序
冒泡排序是一种简单的排序算法。
工作原理:重复地遍历要排序的列表,比较每对相邻项,如果它们的顺序错误就把它们交换过来。
用从小到大的排序举例,先比较第1和第2,再比较第2和第3,再比较第3和第4,依次对比,每一对比过程中如果大的数在前,则两个值位置互换。
时间复杂度最好为O(n),最坏为O(n2),其中n是要排序的元素个数
空间复杂度为O(1),因为它只需要固定的额外空间来进行元素交换,与待排序数据量无关。
def bubbleSort(arr):
for i in range(len(arr) - 1): # 来回推len(arr)-1次 i就是已经排序完成了多少到最后
for j in range(len(arr) - i - 1): # 每一遍都会把未排序部分中最大的推到后面 橙色已排序的部分不需要再排了 故-i
if arr[j] > arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j] # 大的往后排 置换数值
return arr
if __name__ == '__main__':
arr_li = [1, 3, 9, 4, 0, 2, 7, 5, 8, 6]
print(bubbleSort(arr_li))
2、选择排序
选择排序是一种简单且直观的排序算法。
工作原理是:首先在未排序序列中找到最小(或最大)元素,然后将其放到已排序序列的首部或末尾。重复这个过程,直到整个序列有序。这种算法的时间复杂度为O(n2),不需要额外的空间,是一种不稳定的排序算法。
它和冒泡类似,每一次大遍历都是把最大或最小的放置在首部或尾部(橙色部分),需要length-1次大遍历,每次大遍历中有length-1-i次小遍历(i是已排元素个数,也是已经大遍历的次数)
选择排序的时间复杂度为O(n2),空间复杂度为O(1)。
def selectionSort(arr):
for i in range(len(arr) - 1):
minInd = i # 放置最小值的下标
for j in range(i + 1, len(arr)): # 跳过已经排序好的前i个 每次都到len(arr)最后一个元素
print(j)
if arr[j] < arr[minInd]:
minInd = j
# 每一次大遍历后 对比剩余部分最小值和遍历起始下标值
if minInd != i:
arr[i], arr[minInd] = arr[minInd], arr[i]
return arr
if __name__ == '__main__':
arr_li = [1, 3, 9, 4, 0, 2, 7, 5, 8, 6]
print(selectionSort(arr_li))
3、插入排序
插入排序是一种简单且直观的排序算法。
工作原理:依次从未排序元素的首位(或尾部)取出一个元素,将与已排序部分逐个对比,直到满足条件,将取出的元素放置在最后一次对比元素前,重复以上步骤直到未排序元素都被插入并排好序为止。
同冒泡排序时空复杂度,时间复杂度为最好为O(n),最坏为O(n2),,空间复杂度为O(1)。
def insertionSort(arr):
for i in range(len(arr)): # 大遍历次数len(arr)
current = arr[i] # 每次拿出一个current数组 依次和前面的作比较
preInd = i - 1 # current要和这个下标的值对比 第一次是和下标-1的对比 即直接将current放在preInd前(作为排序好的首位)
while preInd >= 0 and arr[preInd] > current:
arr[preInd + 1] = arr[preInd]
preInd -= 1 # 继续往前对比
arr[preInd + 1] = current # 直到前面没有比current大的了 将current放进刚对比的arr[preInd]前
return arr
if __name__ == '__main__':
arr_li = [1, 3, 9, 4, 0, 2, 7, 5, 8, 6]
print(insertionSort(arr_li))
4、希尔排序
希尔排序是一种基于插入排序的排序算法,也被称为“缩小增量排序”。
工作原理:通过将待排序的数组分成若干个子序列,然后对这些子序列分别进行插入排序。这些子序列是原始数组中相隔固定增量(gap)的元素组成的。随着排序进行,增量逐渐减小,最终变为1,此时数组基本有序,最后一次插入排序即可完成排序。希尔排序的关键在于增量序列的选择,不同的增量序列会影响算法的性能。
时间复杂度取决于增量序列的选择,在O(n log2 n)与O(n2)之间。
空间复杂度为O(1),因为希尔排序在排序过程中只需要常数级别的额外空间来存储临时变量。
def shellSort(arr):
gap = len(arr) // 2
while gap > 0: # 每一次跳gap次取元素作为一组
for i in range(gap, len(arr)): # 对同一组内的元素进行插入排序 从后往前遍历已排序的元素并插入 56789
tempInd = i
while tempInd >= gap and arr[tempInd] < arr[tempInd - gap]:
arr[tempInd], arr