排序算法

快速排序
快速排序是对于一个给定的序列,首先选择一个基准值(通常选择起始位置的值),将其放到其所对应的排序位置,使得其左边的元素都小于等于他,右边的元素都大于等于他。然后对左右序列执行相同的操作,直到排序完成。
流程:
(1)选择一个元素作为基准(可以选择序列头元素),设置两个游标,i指向序列首位置,j指向序列尾位置;
(2)先从右往左扫描,遇到小于基准值的停止扫描,然后从左往右扫描,遇到大于基准值的停止扫描,交换两者位置,直到i=j。
python代码

class quik_sort():
    def sort(self, nums):
        if not nums: return []
        if len(nums) == 1: return nums
        return self.qsort(0, len(nums)-1, nums)

    def qsort(self, l, r, nums):
        if l < r:
            key_value = nums[l]
            start = l
            end = r
            while l < r:
                while l < r and nums[r] >= key_value:
                    r -= 1
                while l < r and nums[l] <= key_value:
                    l += 1
                tmp = nums[l]
                nums[l] = nums[r]
                nums[r] = tmp
            nums[start], nums[l] = nums[l], key_value
            self.qsort(start, l-1, nums)
            self.qsort(l+1, end, nums)
        return nums

堆排序
堆排序是利用堆的数据结构来进行排序的一种算法。
堆的定义:堆是一个完全二叉树,每一个父节点的值都大于等于其左右子节点的值的堆称为大顶堆;每个父节点的值都小于等于其左右子节点的值的堆称为小顶堆,堆可以用一个数组进行表示。
大顶堆:arr[i]>=arr[2i+1]&&arr[i]>=arr[2i+2]
小顶堆:arr[i]<=arr[2i+1]&&arr[i]<=arr[2i+2]
堆排序过程:
(1)构造初始堆,升序排列使用大顶堆,降序排列使用小顶堆,从下至上,从右至左进行调整,将大(小)值往上推。
(2)将堆顶元素交换至数组末尾,是的队尾元素最大或最小,调整堆(除去队尾元素),使其仍为一个大顶堆或小顶堆,循环操作,直至排序完成。
升序排序代码:

class heap_sort():
    def heap_sort(self, nums):
        nums = self.init_heap(nums)
        for i in range(len(nums)):
            tmp = nums[0]
            nums[0] = nums[len(nums)-1-i]
            nums[len(nums)-1-i] = tmp
            nums[0:len(nums)-1-i] = self.init_heap(nums[0:len(nums)-1-i])
            # print('hh')
        return nums
#构建堆,也可以用于堆的维护
    def init_heap(self, nums):
        lenl = len(nums)
        ind = lenl // 2 - 1
        while ind >= 0:
        #从右至左循环将子节点大的值往上
            for i in range(ind*2+1, min(lenl-1, ind*2+2)+1):
                if nums[ind] < nums[i]:
                    tmp = nums[ind]
                    nums[ind] = nums[i]
                    nums[i] = tmp
            ind -= 1
        return nums
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值