几种排序算法的Python形式

直接见代码吧,因为比较简单

依次为

  1. 冒泡

  2. 选择

  3. 快排

  4. 插入

  5. 归并

  6. 堆排

  7. 桶排 

class Sort:
    def bubble(self, nums):
        for i in range(len(nums)-1):
            for j in range(len(nums)-1-i):
                if nums[j] > nums[j+1]:
                    nums[j], nums[j+1] = nums[j+1], nums[j]
        print('Bubble: {}'.format(nums))

    def pick(self, nums):
        for i in range(len(nums)-1):
            for j in range(i+1, len(nums)):
                if nums[i] > nums[j]:
                    nums[i], nums[j] = nums[j], nums[i]
        print('Pick: {}'.format(nums))

    def quick(self, nums):
        def qsort(nums, l, r):
            i, j = l, r
            if i >= j: return
            pivot = nums[i]
            while i < j:
                while i < j and nums[j] >= pivot:
                    j -= 1
                nums[i] = nums[j]
                while i < j and nums[i] < pivot:
                    i += 1
                nums[j] = nums[i]
            nums[i] = pivot
            qsort(nums, l, i-1)
            qsort(nums, j+1, r)
        qsort(nums, 0, len(nums)-1)
        print('Quick: {}'.format(nums))

    def insert(self, nums):
        for i in range(1, len(nums)):
            while nums[i]<nums[i-1] and i > 0:
                nums[i], nums[i-1] = nums[i-1], nums[i]
                i -= 1
        print('Insert: {}'.format(nums))

    def merge(self, nums):
        def chaifen(nums, l, r):
            if l >= r: return
            m = (l + r) // 2
            chaifen(nums, l, m)
            chaifen(nums, m+1, r)
            innermerge(nums, l, m, r)
        def innermerge(nums, l, m, r):
            i, j = l, m+1
            res = []
            while i <= m and j<=r:
                if nums[i] < nums[j]:
                    res.append(nums[i])
                    i += 1
                else:
                    res.append(nums[j])
                    j += 1
            while i <= m:
                res.append(nums[i])
                i += 1
            while j <= r:
                res.append(nums[j])
                j += 1
            nums[l:r+1] = res[:]
        chaifen(nums, 0, len(nums)-1)
        print('Merge: {}'.format(nums))

    def heap(self, nums):
        def innerheap(nums, i=0):
            while 2*i+1 <= len(nums)-1:
                while nums[i] < nums[2*i+1]:
                    nums[i], nums[2*i+1] = nums[2*i+1], nums[i]
                    innerheap(nums, 2*i+1)
                if 2*i+2 <= len(nums)-1:
                    while nums[i] < nums[2 * i + 2]:
                        nums[i], nums[2 * i + 2] = nums[2 * i + 2], nums[i]
                        innerheap(nums, 2*i+2)
                i += 1
        res = []
        while nums:
            innerheap(nums)
            res.insert(0, nums.pop(0))
        print('Heap: {}'.format(res))

    def bucket(self, nums):
        n, res = len(nums), []
        bucks = [[] for i in range(n)]
        lenrg = max(nums) - min(nums)
        minNum = min(nums)
        for num in nums:
            idx = int(min(max((num - minNum)/lenrg * n, 0), n-1))
            bucks[idx].append(num)
        for subB in bucks:
            if subB:
                self.insert(subB)
                res += subB
        print('Bucket: {}'.format(res))


if __name__=='__main__':
    nums = [1,4,2,8,5,7,10,3,9]
    s = Sort()
    print('Original: {}'.format(nums))
    s.bubble(nums[:])
    print('#'*100)
    print('Original: {}'.format(nums))
    s.pick(nums[:])
    print('#'*100)
    print('Original: {}'.format(nums))
    s.quick(nums[:])
    print('#'*100)
    print('Original: {}'.format(nums))
    s.insert(nums[:])
    print('#'*100)
    print('Original: {}'.format(nums))
    s.merge(nums[:])
    print('#'*100)
    print('Original: {}'.format(nums))
    s.heap(nums[:])
    print('#'*100)
    print('Original: {}'.format(nums))
    s.bucket(nums[:])
    print('#'*100)

 运行结果在下面

哈哈

猜你喜欢

转载自blog.csdn.net/weixin_42147487/article/details/82734956