python排序方法-插入排序,归并排序,希尔排序,计数排序

使用python实现4种in-place排序算法


分别实现了插入排序,归并排序,希尔排序,计数排序四种排序算法


class Solution:
    # 插入排序 --前半部分已排好顺序,后半部分未排序
    # 当前元素依次向前面已排好顺序中插入
    def insert_sort(self,nums):
        for i in range(len(nums)):
            tmp = nums[i]
            preindex = i-1
            while preindex >=0 and nums[preindex] > tmp:
                nums[preindex+1] = nums[preindex]
                preindex -=1
            nums[preindex+1] = tmp
        return nums


    def sheel_sort(self,nums):
        #希尔排序 -插入排序升级版
        # 重点是构建递增序列 这边使用 3*h +1作为递增列表, 可以不使用gap列表-为了更直观
        n = len(nums)
        gaps = [1]
        h = 1
        while h < n/3:
            h = 3*h + 1
            gaps.insert(0, h)

        for gap in gaps:
            for i in range(gap,n):
                j = i
                while j >= gap and nums[j] <= nums[j-gap]:
                    nums[j], nums[j-gap] = nums[j-gap], nums[j]
                    j -= gap
        return nums


    # 计数排序 类似哈希表-记录每个元素出现的次数,再还原
    def count_sort(self,nums):
        max_value = float('-inf')
        min_value = float('inf')
        for i in range(len(nums)):
            max_value = max(max_value,nums[i])
            min_value = min(min_value,nums[i])
        count_list = [0] * (max_value - min_value+1)
        for i in nums:
            count_list[i-min_value] +=1
        index = 0
        for _ in range(len(count_list)):
            tmp_num = count_list[_]
            tmp_val = _ + min_value
            while tmp_num >0:
                nums[index] = tmp_val
                index +=1
                tmp_num -=1
        return nums


    def merge_sort(self,nums,l,r):
        '''

        :param l: 左指针
        :param r: 右指针
        '''
        #归并排序-自上而下的递归- 传入左右边界 in-place

        def merge(nums,l,m,r):
            # 设置两个左右list变量存储合并的列表-边界值是细节-多次调试
            L = [0] * (m - l + 1)
            R = [0] * (r - m)

            for i in range(m-l+1):
                L[i] = nums[l+i]
            for j in range(r-m):
                R[j] = nums[m+j+1]

            i, j, k = 0, 0, l
            while i < (m-l+1) and j < (r-m):
                if L[i] <= R[j]:
                    nums[k] = L[i]
                    i += 1
                else:
                    nums[k] = R[j]
                    j += 1
                k +=1
            while i < (m-l+1):
                nums[k] = L[i]
                i += 1
                k += 1
            while j < (r-m):
                nums[k] = R[j]
                j += 1
                k += 1


        if l < r:
            mid = l + (r - l) // 2
            self.merge_sort(nums, l, mid)
            self.merge_sort(nums, mid+1, r)
            merge(nums, l, mid, r)

        return nums



if __name__ == '__main__':
    nums = [9,8,7,11,5,4,3,2]
    A = Solution()
    print('希尔排序: ', A.sheel_sort(nums))
    print('计数排序: ', A.count_sort(nums))
    print('插入排序: ', A.insert_sort(nums))
    print('归并排序: ', A.merge_sort(nums, 0, len(nums)-1))


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值