zoukankan      html  css  js  c++  java
  • python实现十大核心算法(桶排没实例)

    # author:sevenduke
    # 2019-06-11
    # 一、交换排序
    # 排序算法的温故:冒泡排序
    
    def dubblesort(arr):
        for i in range(0, len(arr)-1):
            for j in range(0, len(arr) - 1 - i):
                if arr[j] > arr[j+1]:
                    #Python的变量并不直接存储值,而只是引用一个内存地址,交换变量时,只是交换了引用的地址。
                    arr[j], arr[j+1] = arr[j+1], arr[j]
        return arr
    if __name__ == "__main__":
        list = [1,5,3,45,2,34,46,100]
        print("List source is:", list)
        result = dubblesort(list)
        print("List source is:", result)
    # author:sevenduke
    # 2019-06-11
    # 一、交换排序
    # 排序算法的温故:快速排序
    
    def quickSort(arr, left = None, right = None):
        left = 0 if not isinstance(left, (int, float)) else left
        right = len(arr) - 1 if not isinstance(right, (int, float)) else right
        # 可以 <= 不会错,但是程序多执行了许多次没必要的操作
        if left < right:
            partitionInex = parttion(arr,left,right)
            quickSort(arr, left,partitionInex-1)
            quickSort(arr, partitionInex+1, right)
        return arr
    
    def parttion(arr, left, right):
        pivot = left
        position = left + 1
        index = position
        while index <= right:
            if arr[index] < arr[pivot]:
                swap(arr,index,position)
                position += 1
            index += 1
        swap(arr,pivot,position-1)
        print("List source is:", arr)
        return position-1
    
    def swap(arr, i, j):
        arr[i], arr[j] = arr[j], arr[i]
    
    if __name__ == "__main__":
        list = [2,42,53,23,34,290,2344,200,3500]
        print("List source is:",list)
        result = quickSort(list)
        print("List source is:", result)
    # author:sevenduke
    # 2019-06-11
    # 二、选择类排序
    # 排序算法的温故:选择排序
    
    def selectSort(arr):
        for i in range(len(arr)-2):
            minIndex = i
            for j in range(i+1,len(arr)):
                if arr[minIndex] > arr[j]:
                    minIndex = j
            if i != minIndex:
                swap(arr, i, minIndex)
        return arr
    
    def swap(arr, i, j):
        arr[i], arr[j] = arr[j], arr[i]
    
    if __name__ == "__main__":
        list = [2, 42, 53, 23, 34, 290, 2344, 200, 3500]
        print("List source is:", list)
        result = selectSort(list)
        print("List source is:", result)
    import math
    # author:sevenduke
    # 2019-06-11
    # 二、选择类排序
    # 排序算法的温故:堆排序
    # 堆排序分为以下两种:
    #1、大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;
    #2、小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列;
    
    def bulitMaxHeap(arr):
        for i in range(math.floor(len(arr)/2),-1,-1):
            heapify(arr,i)
    
    def swap(arr, i, j):
        arr[i], arr[j] = arr[j], arr[i]
    
    def heapify(arr, i):
        left = i*2+1
        right = i*2+2
        position = i
        if left < arrlen and arr[left] > arr[position]:
            position = left
        if right < arrlen and arr[right] > arr[position]:
            position = right
        if position != i:
            swap(arr,i,position)
            heapify(arr,position)
    
    def heapSort(arr):
        global arrlen
        arrlen = len(arr)
        # 从大到小排序
        bulitMaxHeap(arr)
        # 变化为从小到大排序
        for i in range(len(arr)-1,-1,-1):
            swap(arr,0,i)
            # 将当前可取的最大值拿到末尾
            arrlen -= 1
            heapify(arr,0)
        return arr
    
    if __name__ == '__main__':
        list = [1, 5, 8, 123, 22, 54, 7, 99, 300, 222]
        print("List source is:", list)
        result = heapSort(list)
        print("List sort is:", result)
    # author:sevenduke
    # 2019-06-11
    # 三、插入类排序
    # 排序算法的温故:插入排序
    
    def insertSort(arr):
        for i in range(len(arr)):
            index = i
            for j in range(i,len(arr)):
                if arr[index] > arr[j]:
                    index = j
            if(index != i):
                swap(arr, i, index)
        return  arr
    
    def swap(arr, i, j):
        arr[i], arr[j] = arr[j], arr[i]
    
    if __name__ == "__main__":
        list = [2, 42, 53, 23, 34, 290, 2344, 200, 3500]
        print("List source is:", list)
        result = insertSort(list)
        print("List source is:", result)
    import math
    # author:sevenduke
    # 2019-06-11
    # 三、插入类排序
    # 排序算法的温故:希尔排序
    
    def shellSort(arr):
        incretment = 1
        while(incretment < len(arr)/3):
            incretment = incretment * 3 + 1
        while incretment > 0:
            for i in range(incretment, len(arr)):
                temp = arr[i]
                j = i - incretment
                while j >= 0 and arr[j] > temp:
                    arr[j+incretment] = arr[j]
                    j -= incretment
                arr[j+incretment] = temp
            #incretment = int((incretment-1)/3)
            incretment = math.floor(incretment/3)
        return arr
    
    if __name__ == "__main__":
        list = [2, 42, 53, 23, 34, 290, 2344, 200, 3500]
        print("List source is:", list)
        result = shellSort(list)
        print("List source is:", result)
    import math
    # author:sevenduke
    # 2019-06-11
    # 四、归并类排序
    # 排序算法的温故:归并排序
    
    def mergeSort(arr):
        import math
        if len(arr) < 2:
            return arr
        midIndex = math.floor(len(arr)/2)
        left, right = arr[0:midIndex], arr[midIndex:]
        return merge(mergeSort(left),mergeSort(right))
    def merge(left, right):
        result = []
        while left and right:
            if left[0] < right[0]:
                result.append(left.pop(0))
            else:
                result.append(right.pop(0))
        while left:
            result.append(left.pop(0))
        while right:
            result.append(right.pop(0))
        return result
    if __name__ == "__main__":
        list = [34,24,53,2,43,54,657,3435,2423,231]
        print("List source is:", list)
        result = mergeSort(list)
        print("List source is:", result)
    import math
    # author:sevenduke
    # 2019-06-11
    # 五、分布类类排序
    # 排序算法的温故:计数排序
    # 局限性:适用于有固定范围的排序
    # 桶排序和计数排序本质一致,这里就不做介绍了
    
    def countingSort(arr):
        arrlen = max(arr)+1
        result = [0]*arrlen
        sortIndex = 0
        # 将arr中的数据填入到result数组中
        for i in range(len(arr)):
            if not result[arr[i]]:
                result[arr[i]] = 0
            result[arr[i]] += 1
    
        # 将result数组中的数据写入到arr中
        for i in range(len(result)):
            while result[i] > 0:
                arr[sortIndex] = i
                sortIndex += 1
                result[i] -= 1
        return arr
    
    if __name__ == "__main__":
        list = [2,42,5234,24,243,236,76,767,565,45]
        print("List source is:", list)
        result = countingSort(list)
        print("List source is:", result)
    import math
    # author:sevenduke
    # 2019-06-11
    # 五、分布类类排序
    # 排序算法的温故:基数排序
    # 局限性:适用于整数排序(推广到特定的浮点数,和字符串,以及日期)
    
    
    def redixSort(arr):
        # 找到arr中的最大的位数
        maxNumber = max(arr)
        mN_len = len(str(maxNumber))
        index = 0
        while index < mN_len:
            # 初始化二维数组
            bucket_list = [[] for i in range(10)]
            for elem in arr:
                bucket_list[int(elem / (10**index) % 10)].append(elem)
            arr.clear()
            for elem in bucket_list:
                for num in elem:
                    arr.append(num)
            index += 1
        return arr
    
    if __name__ == "__main__":
        list = [2, 42, 53, 23, 34, 290, 2344, 200, 3500]
        print("List source is:", list)
        result = redixSort(list)
        print("List source is:", result)

     注:2019年6月份的计划是打算一边学习pyhton核心编程这本书,然后用python将以部分算法实现下,回顾下之前学过的内容。之前都在走项目这条路,但是过程中发现自己的写代码的思维跟不上大脑运作的思维,就是最近代码写得太少了。所以打算最近一段时间增强下自己的代码实现能力。这段时间的学习发现编程能力遇到了瓶颈,过分的依赖于别人写好的模板,然后拿去套用,没有掌握核心内容。鉴于应该是自己太想向着实践发展,忽视了自身思维的提升导致的。

  • 相关阅读:
    小程序 ----- 使用less框架
    小程序 ------ 选择器(十)
    小程序 ------ 样式(九)
    小程序 --- 事件绑定(八)
    记一次接口数据获取最大最小值
    flutter——命名路由跳转传值
    Dart——库
    Dart——基础
    人口普查小结
    人口普查-运行截图
  • 原文地址:https://www.cnblogs.com/854594834-YT/p/11012977.html
Copyright © 2011-2022 走看看