排序算法

选择排序

每次都取一个最小的数字,放前面,最后实现排序

原始数组:[10, 1, 2, 9, 4, 0, 8, 6, 7, 3, 5]

第一轮:[0, 1, 2, 9, 4, 10, 8, 6, 7, 3, 5]

第二轮:[0, 1, 2, 9, 4, 10, 8, 6, 7, 3, 5]

第三轮:[0, 1, 2, 9, 4, 10, 8, 6, 7, 3, 5]

第四轮:[0, 1, 2, 3, 4, 10, 8, 6, 7, 9, 5]

第五轮:[0, 1, 2, 3, 4, 10, 8, 6, 7, 9, 5]

第六轮:[0, 1, 2, 3, 4, 5, 8, 6, 7, 9, 10]

第七轮:[0, 1, 2, 3, 4, 5, 6, 8, 7, 9, 10]

第八轮:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

第九轮:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

第十轮:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

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

插入排序

取出数字,然后插入到前面已经排好序的序列中去。

原数组: [10, 1, 2, 9, 4, 0, 8, 6, 7, 3, 5]

第1轮: [1, 10, 2, 9, 4, 0, 8, 6, 7, 3, 5]

第2轮: [1, 2, 10, 9, 4, 0, 8, 6, 7, 3, 5]

第3轮: [1, 2, 9, 10, 4, 0, 8, 6, 7, 3, 5]

第4轮: [1, 2, 4, 9, 10, 0, 8, 6, 7, 3, 5]

第5轮: [0, 1, 2, 4, 9, 10, 8, 6, 7, 3, 5]

第6轮: [0, 1, 2, 4, 8, 9, 10, 6, 7, 3, 5]

第7轮: [0, 1, 2, 4, 6, 8, 9, 10, 7, 3, 5]

第8轮: [0, 1, 2, 4, 6, 7, 8, 9, 10, 3, 5]

第9轮: [0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 5]

第10轮: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

def insert_sort(arr):
    n = len(arr)
    for i in range(n-1):
        cur = i + 1  # 当前待插入元素的索引
        j = i
        pos = 0
        while j >= 0:
            if arr[cur] > arr[j]:
                pos = j + 1 # 待插入位置
                break
            j -= 1
        # 开始插入
        tmp = arr[cur]
        k = cur
        while k > pos:
            arr[k] = arr[k-1]
            k -= 1
        arr[pos] = tmp

冒泡排序

每次经过一轮冒泡将最大的数字沉到最右端。

原数组: [10, 1, 2, 9, 4, 0, 8, 6, 7, 3, 5]

第1轮: [1, 2, 9, 4, 0, 8, 6, 7, 3, 5, 10]

第2轮: [1, 2, 4, 0, 8, 6, 7, 3, 5, 9, 10]

第3轮: [1, 2, 0, 4, 6, 7, 3, 5, 8, 9, 10]

第4轮: [1, 0, 2, 4, 6, 3, 5, 7, 8, 9, 10]

第5轮: [0, 1, 2, 4, 3, 5, 6, 7, 8, 9, 10]

第6轮: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

第7轮: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

第8轮: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

第9轮: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

第10轮: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

def bubble_sort(arr):
    n = len(arr)
    for i in range(0, n-1):
        for j in range(0, n-i-1):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]

合并排序

利用分治的思想,先对左右两个子区域分别进行排序,然后使用线性表合并的方法,将左右两个子区域合并到临时数组,最后拷贝回去。

原数组: [10, 1, 2, 9, 4, 0, 8, 6, 7, 3, 5]

第1轮: [1, 10, 2, 9, 4, 0, 8, 6, 7, 3, 5], start=0, end=1

第2轮:[1, 2, 10, 9, 4, 0, 8, 6, 7, 3, 5], start=0, end=2

第3轮:[1, 2, 10, 4, 9, 0, 8, 6, 7, 3, 5], start=3, end=4

第4轮:[1, 2, 10, 0, 4, 9, 8, 6, 7, 3, 5], start=3, end=5

第5轮:[0, 1, 2, 4, 9, 10, 8, 6, 7, 3, 5], start=0, end=5

第6轮:[0, 1, 2, 4, 9, 10, 6, 8, 7, 3, 5], start=6, end=7

第7轮:[0, 1, 2, 4, 9, 10, 6, 7, 8, 3, 5], start=6, end=8

第8轮:[0, 1, 2, 4, 9, 10, 6, 7, 8, 3, 5], start=9, end=10

第9轮:[0, 1, 2, 4, 9, 10, 3, 5, 6, 7, 8], start=6, end=10

第10轮:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], start=0, end=10

def merge_sort(arr):
    n = len(arr)
    merge(0, n-1, arr)
    
def merge(start, end, arr):
    if start == end:
        return
    mid = (start + end) // 2
    merge(start, mid, arr)
    merge(mid + 1, end, arr)
    tmp = [0]*(end - start + 1)
    index = 0
    p = start
    q = mid + 1
    while p <= mid and q <= end:
        if arr[p] < arr[q]:
            tmp[index] = arr[p]
            index += 1
            p += 1
        else:
            tmp[index] = arr[q]
            index += 1
            q += 1
    while p <= mid:
        tmp[index] = arr[p]
        index += 1
        p += 1
    while q <= end:
        tmp[index] = arr[q]
        index += 1
        q += 1
    for index in range(start, end + 1):
        arr[index] = tmp[index - start]

快速排序

原数组: [10, 1, 2, 9, 4, 0, 8, 6, 7, 3, 5]

[5, 1, 2, 9, 4, 0, 8, 6, 7, 3, 10], key=10

[3, 1, 2, 0, 4, 5, 8, 6, 7, 9, 10], key=5

[0, 1, 2, 3, 4, 5, 8, 6, 7, 9, 10], key=3

[0, 1, 2, 3, 4, 5, 8, 6, 7, 9, 10], key=0

[0, 1, 2, 3, 4, 5, 8, 6, 7, 9, 10], key=1

[0, 1, 2, 3, 4, 5, 7, 6, 8, 9, 10], key=8

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], key=7

def quick_sort(arr):
    n = len(arr)
    quick(0, n-1, arr)
    
def quick(start, end, arr):
    if start >= end:  # 当只有两个元素的时候,left+1可能会超出end
        return
    key = arr[start]
    left = start
    right = end
    while left < right:
        while right > left and arr[right] >= key:
            right -= 1
        if left < right:
            arr[left] = arr[right]
        while right > left and arr[left] <= key:
            left += 1
        if left < right:
            arr[right] = arr[left]
    arr[left] = key
    quick(start, left - 1, arr)
    quick(left + 1, end, arr)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值