各种排序的算法python实现

class Solution(object):
    def bubblesort(self, nums):
        """
        每次循环判断前后两个数大小, 大的往后走, 一次循环下来最大的到最尾部
        第二次循环只需要前n-1个数进行即可
        """
        for i in range(len(nums)):
            flag = True
            for j in range(len(nums)-1-i):
                if nums[j] > nums[j+1]:
                    flag = False
                    nums[j], nums[j+1] = nums[j+1], nums[j]
            if flag:
                break
        return nums
    def fastsort(self, nums):
        def partition(nums, start, end):
            pivot = nums[start]
            i = start
            j = end
            while i < j:
                # 从右向左找比pivot小的数
                while i < j and nums[j] >= pivot:
                    j = j - 1
                # 从左向右找比pivot大的数
                while i < j and nums[i] <= pivot:
                    i = i + 1
                if i < j:
                    nums[j], nums[i] = nums[i], nums[j]
            nums[start], nums[i] = nums[i], nums[start]
            return i
        def recur(nums, start, end):
            if start >= end:
                return
            par_index = partition(nums, start, end)
            recur(nums, start, par_index - 1)
            recur(nums, par_index + 1, end)
            return nums
        start = 0
        end = len(nums) - 1
        return recur(nums, start, end)

    def selectsort(self, nums):
        """
        每次选择出来最小的和i交换
        """
        for i in range(len(nums)-1):
            min_index = i
            for j in range(i+1, len(nums)):
                if nums[j] < nums[min_index]:
                    min_index = j
            if min_index != i:
                nums[i], nums[min_index] = nums[min_index], nums[i]
        return nums

    def insertsort(self, nums):
        for i in range(1, len(nums)):
            key = nums[i]
            j = i - 1
            while j >= 0 and nums[j] > key:
                nums[j+1] = nums[j]
                j = j - 1
            nums[j+1] = key
        return nums

    def mergesort(self, nums):
        def merge(left, right):
            res = []
            i = 0
            j = 0
            while i <= len(left) - 1 and j <= len(right) - 1:
                if left[i] < right[j]:
                    res.append(left[i])
                    i = i+1
                else:
                    res.append(right[j])
                    j = j+1
            if i <= len(left) - 1:
                res = res + left[i:]
            if j <= len(right) - 1:
                res = res + right[j:]
            return res

        if len(nums) == 1:
            return nums
        mid = len(nums) // 2
        left = self.mergesort(nums[0:mid])
        right = self.mergesort(nums[mid:])
        return merge(left, right)

    # https://www.cnblogs.com/chengxiao/p/6129630.html
    def heapsort(self, nums):
        def heapadjust(nums, start, end):
            parent = start
            child = 2 * parent + 1
            while child <= end:
                if child + 1 <= end and nums[child+1] > nums[child]:
                    child = child + 1
                if nums[parent] > nums[child]:
                    return
                else:
                    nums[parent], nums[child] = nums[child], nums[parent]
                    parent = child
                    child = 2 * parent + 1
        start = len(nums) // 2 - 1
        end = len(nums) - 1
        for i in range(start, -1, -1):
            heapadjust(nums, i, end)
        for i in range(len(nums)-1, 0, -1):
            nums[0], nums[i] = nums[i], nums[0]
            heapadjust(nums, 0, i-1)
        return nums
nums = [3,1,2,6,5]
Test = Solution()
print(Test.bubblesort(nums))
nums = [3,1,2,6,5]
print(Test.mergesort(nums))
print("a", nums)
nums = [3,1,2,6,5]
print(Test.selectsort(nums))
nums = [3,1,2,6,5]
print(Test.insertsort(nums))
nums = [3,1,2,6,5]
print(Test.fastsort(nums))
nums = [3,1,2,6,5]
print(Test.heapsort(nums))

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值