• 算法


    冒泡排序 :Bubble Sort
    时间复杂度 : O(N*N)
    说明: 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 import random a = [] for i in range(40): a.append(random.randrange(1,20)) for i in range(len(a) - 1): for j in range(len(a) - i - 1): if a[j] > a[j + 1]: a[j], a[j + 1] = a[j + 1], a[j] print(a)
    插入排序 :Insertion sort
    时间复杂度 : O(N*N)
    说明: 逐一取出元素,在已经排序的元素序列中从后向前扫描,放到适当的位置
    
    data_set = [ 9,1,22,31,45,3,6,2,11 ]
     
    smallest_num_index = 0 #初始列表最小值,默认为第一个
     
    loop_count = 0
    for j in range(len(data_set)):
        for i in range(j,len(data_set)):
            if data_set[i] < data_set[smallest_num_index]: #当前值 比之前选出来的最小值 还要小,那就把它换成最小值
                smallest_num_index = i
            loop_count +=1
        else:
            print("smallest num is ",data_set[smallest_num_index])
            tmp = data_set[smallest_num_index]
            data_set[smallest_num_index] =  data_set[j]
            data_set[j] = tmp
     
        print(data_set)
        print("loop times", loop_count)
    
    选择排序 
    时间复杂度 : O(N*N)
    说明: 首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此递归。
    
    data_set = [ 9,1,22,31,45,3,6,2,11 ]
     
    smallest_num_index = 0 #初始列表最小值,默认为第一个
     
    loop_count = 0
    for j in range(len(data_set)):
        for i in range(j,len(data_set)):
            if data_set[i] < data_set[smallest_num_index]: #当前值 比之前选出来的最小值 还要小,那就把它换成最小值
                smallest_num_index = i
            loop_count +=1
        else:
            print("smallest num is ",data_set[smallest_num_index])
            tmp = data_set[smallest_num_index]
            data_set[smallest_num_index] =  data_set[j]
            data_set[j] = tmp
     
        print(data_set)
        print("loop times", loop_count)
    
    希尔排序:
    时间复杂度:O(n1+£) 0<£<1
    说明:选择一个步长(Step) ,然后按间隔为步长的单元进行排序.递归,步长逐渐变小,直至为1.
    
    import random
    a = []
    for i in range(10000):
        a.append(random.randrange(1,1000))
    
    
    # 希尔运算   整理用的,把大概的顺序 整理好 
    ################################################
    b = int(len(a)/2)
    while b >= 1:
        for i in range(len(a) - b):
            if a[i] > a[i + b]:
                a[i], a[i + b] = a[i + b], a[i]
        b = int(b/2)
    ################################################
    
    f = 0
    # 下面 while 循环 排序的时候 因为希尔运算做过整理,很多时候只判断下就可以了,
    ################################################
    for i in range(len(a)):
        while i > 0 and a[i-1]>a[i]:
            a[i - 1], a[i] = a[i], a[i - 1]
            i -= 1
            f+=1       #24966238 大约循环次数------希尔不给整理
                       #3765358  大约循环次数------希尔整理后
    ################################################
    
    print(f)
    
    #####################################################################
    #堆排序
    #儿子找父亲
    a = []
    for i in range(100):
        a.append(random.randrange(100))
    
    lens = len(a)
    #总长度除以 2 减 1  就是他父亲索引
    parent = int(lens/2-1)
    for ii in range(lens-1):
        last = 0
        #            缩短循环长度
        for i in range(lens-1-ii):
            #循环完剩下的长度
            last = i+1
            # 打印循环长度
            # print(a[0:i])
    
            #找到父亲的索引位置   减ii是找到缩短长度的 父亲索引
            parent = int((lens-i- ii ) / 2 -1)
    
            #判断自己的索引位置是否大于父亲的索引 然后替换
            if a[lens - i - 1-ii] > a[parent]:
                a[lens - i - 1 - ii],a[parent] = a[parent],a[lens - i - 1-ii ]
    
        #交换最大元素 把最大的元素衣服往后面排放lens-ii-1
        a[0],a[last] = a[last],a[0]
        print(a)
        print(last)
    #####################################################################
    
    #堆排序 从父亲找儿子
    dataset = [random.randrange(50) for i in range(20)]
    
    # 从大往小循环 list 的长度
    for i in range(len(dataset)-1,0,-1):
        print(i)
        #每次循环 把最大的值放到最前面
        for index in range(int((i+1)/2),0,-1):
    
            p_index = index
            l_child_index = p_index *2 - 1
            r_child_index = p_index *2
            p_node = dataset[p_index-1]
            left_child =  dataset[l_child_index]
    
            #如果 left chil  大于 parent
            if p_node < left_child:
                dataset[p_index - 1], dataset[l_child_index] = left_child, p_node
                p_node = dataset[p_index - 1]
    
            #如果 right chil 索引 大于 循环 list len
            if r_child_index < len(dataset[0:i+1]):
                right_child =  dataset[r_child_index]
                if p_node < right_child:
                    dataset[p_index - 1] , dataset[r_child_index] = right_child,p_node
                    p_node = dataset[p_index - 1]
        #把list 的第一个值 放到最后
        dataset[0],dataset[i] = dataset[i],dataset[0]
    print(dataset)
    
    #快排
    #最快的排序
    
    def quick_sort(array, left, right):
    
        if left >= right:
            return
        low = left
        high = right
        key = array[low]  # 第一个值
    
        while low < high:  # 只要左右未遇见
            while low < high and array[high] > key:  # 找到列表右边比key大的值 为止
                high -= 1
            # 此时直接 把key(array[low]) 跟 比它大的array[high]进行交换
            array[low] = array[high]
            array[high] = key
    
            while low < high and array[low] <= key:  # 找到key左边比key大的值,这里为何是<=而不是<呢?你要思考。。。
                low += 1
                # array[low] =
            # 找到了左边比k大的值 ,把array[high](此时应该刚存成了key) 跟这个比key大的array[low]进行调换
            array[high] = array[low]
            array[low] = key
    
        quick_sort(array, left, low - 1)  # 最后用同样的方式对分出来的左边的小组进行同上的做法
        quick_sort(array, low + 1, right)  # 用同样的方式对分出来的右边的小组进行同上的做法
    
    
    if __name__ == '__main__':
        array = [random.randrange(10000) for i in range(10000)]
        quick_sort(array, 0, len(array) - 1)
        print("-------final -------")
        print(array)
    
    #二分算法
    
    #!/usr/bin/python3.4
    # -*- coding: utf-8 -*-
    #PS: 最小值0  最大值10   k为 7
    #       中间值  5 < k7
    #       最小值  5+1  +  最大值 10  =  中间值    8
    #       中间值  k7 < 8
    #       最小值  6  + 最大值 8-1  = 中间值  6
    #       中间值  6 < k7
    #       最小值  6+1   最大值 7   =  中间值 7
    #       中间值  7 == k7
    def BinarySearch(arr, key):
        #最小值
        mins = 0
        #最大值
        maxs = len(arr) - 1
        if key in arr:
            # 建立一个死循环,直到找到key
            i = 0
            while True:
                #得到每次查找次数
                i += 1
                #得到中间值
                center = int((mins + maxs) / 2)
                #如果key 小于 中间值  那么最大值就等于 中间值 的下一位  最小值不变  #为什么最小值 不变呢,因为有可能等于最小值
                if key < arr[center]:
                    maxs = center - 1
                #如果key 大于 中间值 那么最小值就等于中间值的 上一位, 最大值不变   #为什么最大值 不变呢,因为有可能等于最大值
                elif  arr[center] < key:
                    mins = center + 1
                # key在数组中间
                elif arr[center] == key:
                    print(str(key) + "在数组里面的第" + str(center) + "个位置" + '----%s'%i)
                    return arr[center]
        else:
            print("没有该数字!")
    
    
    if __name__ == "__main__":
        arr = []
        for i in range(10000000):
            arr.append(i)
        while True:
            key = input("请输入你要查找的数字:")
            if key == " ":
                print("谢谢使用!")
                break
            else:
                BinarySearch(arr, int(key))
    
    #后序遍历
    
    class Tree(object):
        def __init__(self,data=None,left=None,right=None):
            self.data = data
            self.left = left
            self.right = right
    
    class Btree(object):
        def __init__(self,root):
            self.root = root
        #前序遍历   根节点  >  左子树   >  右子树
        def perOrder(self,node):
            print(node.data)
            if type(node.left) == type(""):
                print(node.left)
            elif node.left is None:
                pass
            elif type(node.left) == type(self.root):
                self.perOrder(node.left)
    
            if type(node.right) == type(""):
                print(node.right)
    
            elif node.right is None:
                pass
            elif type(node.right) == type(self.root):
                self.perOrder(node.right)
            return
    
        #中序遍历   左子树  >   根节点   >   右子树
        def perIrder(self, node):
            #如果左子树 是字符串类型 就打印
            if type(node.left) == type(""):
                print(node.left)
            #如果左子树是空 什么都不干
            elif node.left is None:
                pass
            #如果是对象 那么就进入
            elif type(node.left) == type(self.root):
                self.perIrder(node.left)
    
            print(node.data)
    
            if type(node.right) == type(""):
                print(node.right)
    
            elif node.right is None:
                pass
            elif type(node.right) == type(self.root):
                self.perIrder(node.right)
    
            #最后返回
            return
    
        #后序遍历  左子树  >  右子树   >   根节点
        def perBrder(self, node):
            if type(node.left) == type(""):
                print(node.left)
            elif node.left is None:
                pass
            elif type(node.left) == type(self.root):
                self.perBrder(node.left)
    
            if type(node.right) == type(""):
                print(node.right)
    
            elif node.right is None:
                pass
            elif type(node.right) == type(self.root):
                self.perBrder(node.right)
    
            print(node.data)
            return
    
    n1 = Tree('n1','n1-left','n1-right')
    
    n2 = Tree('n2',n1,'n2-right')
    
    n3 = Tree('n3','n3-left',n2)
    
    n4 = Tree('n4','n4-left','n4-right')
    
    n5 = Tree('n5',n4,n3)
    
    n6 = Tree('n6','n6-left',n5)
    
    n7 = Tree('n7',n6,'n7-right')
    
    n8 = Tree('n8',)
    
    n9 = Tree('root',n7,n8)
    
    obj = Btree(n9)
    
    obj.perBrder(obj.root)
    
  • 相关阅读:
    CCOrbitCamera卡牌翻转效果
    用CCRenderTexture和BlendFunc制作游戏教学时使用的黑色覆盖层
    cocos2d-x触摸分发器原理
    cocos2d-x动作原理
    c++之函数原型
    cocos2d-x调度器原理
    cocos2d-x之MoonWarriors用c++实现
    cocos2d-x回收池原理
    SQL*Net more data to client等待事件
    asynch descriptor resize等待事件
  • 原文地址:https://www.cnblogs.com/cloniu/p/6568280.html
Copyright © 2020-2023  润新知