数据结构 6.排序

本文详细介绍了排序算法中的稳定性和不稳定性,并分别讲解了冒泡排序、插入排序、归并排序作为稳定的排序算法,以及选择排序、堆排序、快速排序作为不稳定的排序算法的实现原理。

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

一、排序

在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,该排序方法是稳定的;若具有相同关键字的记录之间的相对次序发生改变,则称这种排序方法是不稳定的。即所有相等的数经过某种排序方法后,仍能保持它们在排序之前的相对次序,则说这种排序算法是稳定的,反之,就是不稳定的。

1. 稳定的排序算法

稳定的排序 时间复杂度 空间复杂度
冒泡排序(bubble sort) 最差、平均都是O(n^2),最好是O(n) 1
插入排序(insertion sort) 最差、平均都是O(n^2),最好是O(n) 1
归并排序(merge sort) 最差、平均、最好都是O(n log n) O(n)
桶排序(bucket sort) O(n) O(k)
基数排序(Radix sort) O(dn)(d是常数) O(n)
二叉树排序(Binary tree sort) O(n log n) O(n)

1.1 冒泡排序的实现

使用双重for循环,内层变量为i, 外层为j,在内层循环中不断的比较相邻的两个值(i, i+1)的大小,如果i+1的值大于i的值,交换两者位置,每循环一次,外层的j增加1,等到j等于n-1的时候,结束循环

def bubble_sort(arr):
    n = len(arr)
    for j in range(0, n - 1):
        for i in range(0, n - 1 - j): # i每循环一次都能把最大的值以此从右边排起
            if arr[i] > arr[i + 1]:
                arr[i], arr[i + 1] = arr[i + 1], arr[i]

arr = [7, 4, 3, 67, 34, 1, 8]
bubble_sort(arr)
print(arr)  # [1, 3, 4, 7, 8, 34, 67]

1.2 插入排序的实现

排序以从小到大排序为例,元素0为第一个元素,插入排序是从元素1开始,尽可能插到前面。插入时分插入位置和试探位置,元素i的初始插入位置为i,试探位置为i-1,在插入元素i时,依次与i-1,i-2······元素比较,如果被试探位置的元素比插入元素大,那么被试探元素后移一位,元素i插入位置前移1位,直到被试探元素小于插入元素或者插入元素位于第一位。

def insertSort(arr):
    length = len(arr)
    for i in range(1,length):
        x = arr[i] # 考虑插入的数
        for j in range(i,-1,-1):
            # j为当前位置,试探j-1位置
            if x < arr[j-1]:
                arr[j] = arr[j-1]
            else:
                # 位置确定为j
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值