数据结构分析及算法:

入门,学习了三个排序
万字长文|十大基本排序,一次搞定

1.选择排序
先选最小的,再遍历一遍第二小的,依次进行。

def selection_sort(arr):
    for i in range(len(arr)-1):
        min_index = i
        for j in range(i+1, len(arr)):
            if arr[j] < arr[min_index]:
                min_index = j
        if i != min_index:
            arr[min_index], arr[i] = arr[i], arr[min_index]
    return arr

arr = [2,3,6,1,0,5,8]
print(selection_sort(arr))

2.插队排序(类似于扑克牌)
从数组中第二个开始,依次与前面作比较,小于前面的,就与前面交换位置,即插进去


```python
```python
def insertion_sort(array):
    for i in range(len(array)):
        while array[i - 1] > array[i] and i - 1 >= 0:
            # array[i], array[i - 1] = array[i - 1], array[i]
            key= array[i]
            array[i]=array[i-1]
            array[i - 1]=key
            i =i-1
    return array


if __name__ == '__main__':
    array = [10, 17, 50, 7, 30, 24, 27, 45, 15, 5, 36, 21]
    print(insertion_sort(array))

计算插队排序的比较次数:

def insertion_sort(array):
    a=0
    for i in range(len(array)):
        while array[i - 1] > array[i] and i - 1 >= 0:
            # array[i], array[i - 1] = array[i - 1], array[i]
            key= array[i]
            array[i]=array[i-1]
            array[i - 1]=key
            i =i-1
            a=a+1
        if i != 0:#这地方容易出错,忽视掉,所以我开始多加了两次
            a += 1
    print(a)
    return array,(a)


if __name__ == '__main__':
    array = [10, 17, 50, 7,30]
    # array =[3,1,4,1, 5,9,6,5]
    print(insertion_sort(array))

3.归并排序(分治思想)

def mergeSort(arr):
#递归结束条件
    if len(arr) == 1:
        return
        
    mid = len(arr) // 2
    l = arr[:mid]
    r = arr[mid:]
    mergeSort(l)#递归当前左半部分
    mergeSort(r)#递归当前右半部分
    #注意:递归本质:递归是递归到底层再回传
    i = 0
    j = 0
    k = 0
    #把较小的数先移到新数组中
    while i < len(l) and j < len(r):
        if l[i] <= r[j]:
            arr[k] = l[i]
            i += 1
        else:
            arr[k] = r[j]
            j += 1
        k += 1
     #把左边数组剩余的数移入数组
    while i < len(l):
        arr[k] = l[i]
        k += 1
        i += 1
    #把右边剩余的数移入数组
    while j < len(r):
        arr[k] = r[j]
        k += 1
        j += 1


if __name__ == '__main__':
    list1 = [2,5,6,1,7,3,8,4]
    mergeSort(list1)
    for i in list1:
        print(i)

归并算法动态图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值