排序算法

一、冒泡排序

重复比较相邻的元素。如果第一个比第二个大,就交换他们两个

def bubble_sort(arr):
    # 获取数组的长度
    n = len(arr)
    # 遍历数组进行数组的排序
    for i in range(n):
        for j in range(n - 1): #循环n-1次
            if arr[j] > arr[j + 1]:
                temp = arr[j + 1]  # 前一个比后一个大,则前一个跟后一个对换,知道换到最后一个
                arr[j + 1] = arr[j]
                arr[j] = temp
    return arr

arr = [10, 9, 6, 5, 8, 7, 4, 3, 2, 1]
sort_arr = bubble_sort(arr)
print("排序后的结果:{}".format(sort_arr))

二、选择排序

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

def selection_sort(arr):
    """
    选择排序
    :param arr:
    :return:
    """
    # 获取数组的长度
    n = len(arr)
    for i in range(n):
        min_index = i
        for j in range(i + 1, n):  # 遍历后面的数
            if arr[j] < arr[min_index]:
                # 只要有比他小的就把下标赋值给min_index
                min_index = j
        # 把最小的数跟当前的位置的数位置互换
        temp = arr[i]
        arr[i] = arr[min_index]
        arr[min_index] = temp
    return arr


arr = [3, 1, 10, 9, 8, 7, 6, 2, 5, 4]
sort_arr = selection_sort(arr)
print("排序后的结果:{}".format(sort_arr))

3,插入排序

要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。

def insertion_sort(arr):
    """
    插入排序
    :param arr:
    :return:
    """
    n = len(arr)
    print(arr)
    # 遍历数组进行数组的排序
    for i in range(1, n):
        pre_index = i - 1
        current = arr[i]
        findIndex = i
        # 和之前的有序序列进行比较,当前值小于前一个值当前值跟前一个值替换,知道当前值是最小的
        '''
        [3, 10, 1]
        [1, 3, 10] arr2=arr1 arr1=arr0 逐个替换,租后剩下finindex==0,current插入到找到的位置,并替换找到的位置让arr[findIndex] = current即可
        '''
        while current < arr[pre_index] and pre_index >= 0:
            arr[pre_index + 1] = arr[pre_index]  # 替换前一个值
            findIndex = pre_index
            pre_index -= 1  # 索引下标往前移动,继续循环比较
        # 将current插入到找到的位置,并替换找到的位置
        arr[findIndex] = current
        print(arr)
    return arr


arr = [10, 3, 1, 9, 8, 7, 6, 2, 5, 4]
sort_arr = insertion_sort(arr)
print("排序后的结果:{}".format(sort_arr))

[10, 3, 1, 9, 8, 7, 6, 2, 5, 4]
[3, 10, 1, 9, 8, 7, 6, 2, 5, 4]
[1, 3, 10, 9, 8, 7, 6, 2, 5, 4]
[1, 3, 9, 10, 8, 7, 6, 2, 5, 4]
[1, 3, 8, 9, 10, 7, 6, 2, 5, 4]
[1, 3, 7, 8, 9, 10, 6, 2, 5, 4]
[1, 3, 6, 7, 8, 9, 10, 2, 5, 4]
[1, 2, 3, 6, 7, 8, 9, 10, 5, 4]
[1, 2, 3, 5, 6, 7, 8, 9, 10, 4]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
排序后的结果:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

4,希尔排序

希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”,是直接插入排序算法的一种更高效的改进版本

def shell_sort(arr):
    # 获取数组的长度
    n = len(arr)
    # 计算步长
    gap = 1 * 3 + 2
    # 遍历进行更新操作
    while gap > 0:
        # 遍历数组进行数组的排序
        for i in range(gap, n):
            # 之前后续序列部分的最后一个值的索引位置
            '''
            将全部元素分成小于n的子序列,在子序列中分别执行插入排序
            
            [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
            [5, 9, 8, 7, 6, 10, 4, 3, 2, 1]  比较坐标0,5/1,6 .../4,9  比较大小,交换顺序。
            '''
            pre_index = i - gap
            # 当前值
            current = arr[i]
            # 和之前的有序序列进行比较,找到比当前值小的那个位置
            print(arr)
            while arr[pre_index] > current and pre_index >= 0:
                # 将大于current的数据往后移动
                arr[pre_index + gap] = arr[pre_index]
                # print(pre_index + gap)
                # print(pre_index)
                # 索引下标往前移动,继续比较
                pre_index -= gap
            # 将current插入到找到的位置
            arr[pre_index + gap] = current
        gap = gap // 3 #缩小增量,缩小步长
    return arr



arr = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
sort_arr = shell_sort(arr)
print("排序后的结果:{}".format(sort_arr))


[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]  
[5, 9, 8, 7, 6, 10, 4, 3, 2, 1]  #0 5
[5, 4, 8, 7, 6, 10, 9, 3, 2, 1]
[5, 4, 3, 7, 6, 10, 9, 8, 2, 1]
[5, 4, 3, 2, 6, 10, 9, 8, 7, 1]
[5, 4, 3, 2, 1, 10, 9, 8, 7, 6]
[4, 5, 3, 2, 1, 10, 9, 8, 7, 6]
[3, 4, 5, 2, 1, 10, 9, 8, 7, 6]  # 21  10  [4,5,3..]=>21->[4,3,5..]=>10=>[3,4,5..]
[2, 3, 4, 5, 1, 10, 9, 8, 7, 6]
[1, 2, 3, 4, 5, 10, 9, 8, 7, 6]
[1, 2, 3, 4, 5, 10, 9, 8, 7, 6]
[1, 2, 3, 4, 5, 9, 10, 8, 7, 6]
[1, 2, 3, 4, 5, 8, 9, 10, 7, 6]
[1, 2, 3, 4, 5, 7, 8, 9, 10, 6]
排序后的结果:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值