选择,插入,冒泡排序

总是忘记,上网搜了一下发现几乎所有人都这样。解决的办法只能重复重复再重复了。 o(╥﹏╥)o
 
选择,插入,冒泡排序都是基于数组的,对于规模小的数据效率较高,而且都是原地排序不需借助额外数组,只需要几个临时变量即可,所以先放一起重新实现一下。
 
1. 选择排序 
思路:每次都从未排序的部分找出最大/小的元素,然后交换当前数据和最值数据的位置。
def selectionSort(arr):
    if not arr or len(arr) == 1:
        return arr
    length = len(arr)

    for index in range(0,length): #外层循环次数为数组长度
        cur_min = index
        for j in range(index, length): #内层循环是未排序的长度
            if arr[cur_min] > arr[j]: #如果当前值比最小值还需,那么把设置最小值下标为当前值下标
                cur_min = j
            else:
                continue

        if index != cur_min: #交换未排序的首元素和最小元素
            tmp = arr[cur_min]
            arr[cur_min] = arr[index]
            arr[index] = tmp

    return arr

 

2. 插入排序

思路:假定初始状态第一个元素是排好序的,外层从数组第二个开始遍历找每个元素应该在已排序的序列插入的位置

def insertionSort(arr):
    if not arr or len(arr) == 1:
        return arr
    length = len(arr)

    for i in range(1, length): # 从第二个元素开始
        cur = arr[i]
        j = i - 1
        while (cur < arr[j]) & (j >= 0):  # 如果当前元素一直比已排序的小,那么往后移动已排序元素
            arr[j+1] = arr[j]
            j -= 1
        if j != i: # 注意, 这里是i, 不是i-1, 因为while 会把j多减一次
             arr[j+1] = cur
    return arr

 

3. 冒泡排序

相邻元素比较,升序的话,把大的换到右边, 一趟下来能找出最大的,然后再重复。

def bubbleSort(arr):
    if not arr or len(arr) == 1:
        return arr
    length = len(arr)

    for i in range (0, length):
        for j in range(0, length - i -1): #注意边界
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
                # tmp = arr[i]
                # arr[i] = arr[j]
                # arr[j] = tmp
    return arr

 

再来一份复杂度pk表加深印象:

算法 平均时间复杂度 最好 最坏 空间复杂度 排序方式 稳定性
选择排序 n2 n2 n2 1 原地排序 不稳定
插入排序 n2 n n2 1 原地排序 稳定
冒泡排序 n2 n2 n2 1 原地排序 稳定

 

 

 
posted @ 2021-04-23 16:57  水天需  阅读(69)  评论(0编辑  收藏  举报