排序算法python实现

博客介绍了排序算法中面试常考且重要的两个算法。快速排序通过一趟排序分割记录,再分别对两部分继续分割直至有序;堆排序基于完全二叉树,有大顶堆和小顶堆,通过创建堆、交换堆顶元素并调整堆,重复操作直至堆长度为1。

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

排序算法中面试经常遇到的算法,也是最重要的两个算法!

算法(一):快速排序

思想:通过一趟排序将待排序的记录分割成两部分,一部分关键字均大于另一部分记录的关键字,然后分别在对两部分分别进行分割,直到这个记录都是有序的为止。

做法:

(1)设置两个变量i,j,开始的时候i = 0,j = n-1

(2)将第一个数据作为基准,赋给key值,key = data[0]

(3)从j开始向前搜索,即j --,当找到第一个小于key的值,将data[j] 与data[i]交换

(4)从i开始向后搜索,即i ++,当找到第一个大于可以的值,将data[i] 与data[j]交换

(5)重复(3)(4)直达i = j

def quick_sort(data,start,end):
    if start < end:
        i,j = start,end
        key = data[i]
        while i < j:
            while i < j and key >= data[j]:
                j = j - 1
            data[i] = data[j]
            while i < j and key >= data[i]:
                i = i + 1
            data[j] = data[i]
        data[i] = key
        quick_sort(data,start,i-1)
        quick_sort(data,j+1,end)
    return data

算法(二)堆排序

知识点:堆是一种完全二叉树,堆有两种类型:大顶堆和小顶堆

大顶堆是每个节点的值都大于等于它的左右孩子节点的值,小顶堆是反之。

思想:

(1)创建大顶堆(小顶堆),

(2)将堆顶元素和最下最右面节点交互,剩余节点在调整为一个大顶堆(小顶堆),

(3)重复(1)(2)直到这个大顶堆(小顶堆)的长度为1

代码

def BuildMaxHeap(data,length):
    for i in range(length//2,0,-1):
        AdjustDown(data,i,length)
def AdjustDown(data,k,length):
    data[0] = data[k]
    i = 2 * k
    while i <= length:
        if i < length and data[i] < data[i + 1]:
            i = i + 1
        if data[0] >= data[i]:
            break
        else:
            data[k] = data[i]
            k = i
            i = 2 * k
    data[k] = data[0]

归并排序:

class solution:
    def __init__(self):
        self.count = 0

    def InversePairs(self,data):
        def Merge(a,b):
            c = []#新的数组
            i = j = 0#两个数组的指针
            while i < len(a) and j < len(b):
                if a[i] <= b[j]:
                    c.append(a[i])
                    i = i + 1#选择前面a数组的开头元素,指针后移
                else:
                    self.count += len(a) - i
                    c.append(b[j])
                    j = j + 1#选择后面b数组的开头元素,指针后移
            if i == len(a):#后面b数组还有元素
                for k in b[j:]:
                    c.append(k)
            else:#前面a数组还有元素
                for k in a[i:]:
                    c.append(k)
            return c
        def Merge_sort(lst):
            if len(lst) <= 1:
                return lst
            mid = len(lst) // 2
            left = Merge_sort(lst[:mid])
            right = Merge_sort(lst[mid:])
            return Merge(left,right)
        Merge_sort(data)
        return self.count

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值