排序算法

博客介绍了几种常见的排序算法。冒泡排序通过重复比较相邻元素并交换位置来排序;选择排序每次从待排序元素中选最小或最大元素放在起始位置;插入排序用于在已排好序的序列中插入新数并保持有序;希尔排序是插入排序的高效改进版本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、冒泡排序

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

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]

 

 

 

 

 

 

 

 

基于数据挖掘的音乐推荐系统设计与实现 需要一个代码说明,不需要论文 采用python语言,django框架,mysql数据库开发 编程环境:pycharm,mysql8.0 系统分为前台+后台模式开发 网站前台: 用户注册, 登录 搜索音乐,音乐欣赏(可以在线进行播放) 用户登陆时选择相关感兴趣的音乐风格 音乐收藏 音乐推荐算法:(重点) 本课题需要大量用户行为(如播放记录、收藏列表)、音乐特征(如音频特征、歌曲元数据)等数据 (1)根据用户之间相似性或关联性,给一个用户推荐与其相似或有关联的其他用户所感兴趣的音乐; (2)根据音乐之间的相似性或关联性,给一个用户推荐与其感兴趣的音乐相似或有关联的其他音乐。 基于用户的推荐和基于物品的推荐 其中基于用户的推荐是基于用户的相似度找出相似相似用户,然后向目标用户推荐其相似用户喜欢的东西(和你类似的人也喜欢**东西); 而基于物品的推荐是基于物品的相似度找出相似的物品做推荐(喜欢该音乐的人还喜欢了**音乐); 管理员 管理员信息管理 注册用户管理,审核 音乐爬虫(爬虫方式爬取网站音乐数据) 音乐信息管理(上传歌曲MP3,以便前台播放) 音乐收藏管理 用户 用户资料修改 我的音乐收藏 完整前后端源码,部署后可正常运行! 环境说明 开发语言:python后端 python版本:3.7 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:pycharm
MPU6050是一款广泛应用在无人机、机器人和运动设备中的六轴姿态传感器,它集成了三轴陀螺仪和三轴加速度计。这款传感器能够实时监测并提供设备的角速度和线性加速度数据,对于理解物体的动态运动状态至关重要。在Arduino平台上,通过特定的库文件可以方便地与MPU6050进行通信,获取并解析传感器数据。 `MPU6050.cpp`和`MPU6050.h`是Arduino库的关键组成部分。`MPU6050.h`是头文件,包含了定义传感器接口和函数声明。它定义了类`MPU6050`,该类包含了初始化传感器、读取数据等方法。例如,`begin()`函数用于设置传感器的工作模式和I2C地址,`getAcceleration()`和`getGyroscope()`则分别用于获取加速度和角速度数据。 在Arduino项目中,首先需要包含`MPU6050.h`头文件,然后创建`MPU6050`对象,并调用`begin()`函数初始化传感器。之后,可以通过循环调用`getAcceleration()`和`getGyroscope()`来不断更新传感器读数。为了处理这些原始数据,通常还需要进行校准和滤波,以消除噪声和漂移。 I2C通信协议是MPU6050与Arduino交互的基础,它是一种低引脚数的串行通信协议,允许多个设备共享一对数据线。Arduino板上的Wire库提供了I2C通信的底层支持,使得用户无需深入了解通信细节,就能方便地与MPU6050交互。 MPU6050传感器的数据包括加速度(X、Y、Z轴)和角速度(同样为X、Y、Z轴)。加速度数据可以用来计算物体的静态位置和动态运动,而角速度数据则能反映物体转动的速度。结合这两个数据,可以进一步计算出物体的姿态(如角度和角速度变化)。 在嵌入式开发领域,特别是使用STM32微控制器时,也可以找到类似的库来驱动MPU6050。STM32通常具有更强大的处理能力和更多的GPIO口,可以实现更复杂的控制算法。然而,基本的传感器操作流程和数据处理原理与Arduino平台相似。 在实际应用中,除了基本的传感器读取,还可能涉及到温度补偿、低功耗模式设置、DMP(数字运动处理器)功能的利用等高级特性。DMP可以帮助处理传感器数据,实现更高级的运动估计,减轻主控制器的计算负担。 MPU6050是一个强大的六轴传感器,广泛应用于各种需要实时运动追踪的项目中。通过 Arduino 或 STM32 的库文件,开发者可以轻松地与传感器交互,获取并处理数据,实现各种创新应用。博客和其他开源资源是学习和解决问题的重要途径,通过这些资源,开发者可以获得关于MPU6050的详细信息和实践指南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值