美文网首页
常见算法

常见算法

作者: 梦醒家先生 | 来源:发表于2018-08-22 23:47 被阅读0次

    1. 组合数字

    num = input("please input a number:")
    count = 0
    for i in range(1, num):
        for j in range(1, num):
            for k in range(1, num):
                if i != j and i != k and j != k:
                    print(i * 100 + j * 10 + k)
                    count += 1
    
    print(count)
    

    2. 冒泡排序

    • 简介:最基础的排序
    • 原理. 过程跟踪
    1. 内部:相邻元素两两比较 数次比较循环, 最大的元素放到了最后
    2. 外部:数次冒泡排序后,最终形成了一个从小到大的排序

    步骤: **元素比较 (内部的比较循环) (外部的冒泡循环) ** **异常情况 **

    """
    1、元素比较---比较循环---外部的冒泡循环---异常情况
    2、写法:
    外部循环冒泡
        内部比较循环
            元素比较
        异常情况处理
    """
    def maopao(alist):
        n = len(alist)
    
        # 外部的冒泡排序循环
        for j in range(n - 1, 0, -1):
            count = 0
            # 内部的元素比较循环
            for i in range(j):
                # 元素的替换
                if alist[i] > alist[i + 1]:
                    alist[i], alist[i + 1] = alist[i + 1], alist[i]
                    count += 1
    
            # 异常情况
            if count == 0:
                break
    
    
    if __name__ == '__main__':
        alist = [3, 44, 56, 78, 4, 6, 90]
        maopao(alist)
        print(alist)
    
    
    • 思路:

    1、流程:元素比较-----比较循环——外部的冒泡循环----异常情况

    2、写法:外部冒泡循环

    ​ 内部比较循环

    ​ 元素比较

    ​ 异常情况处理

    • 成本分析

    最优:O(n)

    最坏:O(n*n)

    稳定性:稳定

    3. 选择排序

    • 简介:简单直观的排序算法
    • 原理
    1. 无序队列选择最小的元素,最小元素和无序第一个元素替换
    2. 无序队列重复执行1
    • 步骤:
    1. 元素比较 选最小
    2. 最小元素和第一元素替换
    3. 外部的挑选循环
    """
    1、流程:比较循环(选最小)---元素替换---外部选择循环
    2、写法:
    外部的选择循环
        内部的比较循环(选最小)
            比较条件
        元素替换
    
    '每次选择循环的时候,无序列表的首个元素的下标一直在变动'
    """
    def xuanze(alist):
        n = len(alist)
        # 外部的选择循环
        for j in range(n - 1):
    
            min_index = j
            # 比较循环后,选择最小的
            for i in range(min_index + 1, n):
                # 元素比较
                if alist[i] < alist[min_index]:
                    min_index = i
    
            # 元素替换
            if min_index != j:
                alist[min_index], alist[j] = alist[j], alist[min_index]
    
    
    if __name__ == '__main__':
        alist = [3, 44, 56, 78, 4, 6, 90]
        xuanze(alist)
        print(alist)
    
    • 思路:

    1、流程:比较循环(选最小)----元素替换——外部选择循环

    2、写法:

    ​ 外部的选择循环

    ​ 内部的比较循环(选最小)

    ​ 比较条件

    ​ 元素替换
    关键点:每次选择循环的时候,无序列表的首个元素的下标一直在变动。

    • 成本分析:

    最优:O(n*n)

    最坏:O(n*n)

    稳定性:不稳定

    4. 插入排序

    • 简介:先定义一个有序队列,然后把无序队列中的第一个元素放到有序队列的 合适位置,重复操作,直至形成一个完整的有序队列 。打扑克
    • 原理:
    1. 无序队列选择第一个元素放到有序队列的末尾
    2. 有序队列里面进行冒泡排序 (往前冒泡)
    3. 重复前面两个步骤
    • 步骤

    有序队列(外部):

    ​ 元素替换

    ​ 冒泡循环

    插入排序循环(内部):

    ​ 无序队列元素向有序队列放

    """
    1、流程:元素替换---冒泡排序---外部的插入排序循环
    2、写法:
    外部的插入排序循环
        有序列队的冒泡排序
            有序列队的元素比较
    """
    
    def charu(alist):
        n = len(alist)
    
        # 外部的插入排序循环
        for i in range(n):
    
            # 假设无序列表的第一个位置元素的下标值是 i
            for j in range(i, 0, -1):
    
                # 有序列表内部元素比较
                if alist[j] < alist[j - 1]:
                    alist[j], alist[j - 1] = alist[j - 1], alist[j]
    
                else:
                    break
    
    
    if __name__ == '__main__':
        alist = [3, 44, 56, 78, 4, 6, 90]
        charu(alist)
        print(alist)
    
    • 思路:

    1、流程:元素替换----冒泡排序——外部的插入排序循环

    2、写法:

    ​ 外部的插入排序循环

    ​ 有序队列的冒泡排序

    ​ 有序队列的元素比较

    • 成本分析

    最优:O(n)

    最坏:O(n*n)
    稳定性:稳定

    5. 快速排序

    • 简介:划分交换排序,1.从无序列表中挑选出一个元素,把无序列表分割成独立的两个部分,2.其中一部分的所有数据都比另外一部分的所有数据都要小,3.然后在按照此方法对这两部分数据进行快速排序,4.这个排序过程是递归进行
    • 原理

    一、挑元素、划分组、分组重复前两步

    ​ 1、在无序列表中挑选一个随机的数字,作为当前列表的中间值

    ​ 2、移动左右标签,将比中间值大的放在右侧,比中间值小的放在左侧

    ​ 3、当两个标签重合的时候,中间值归位

    二、特点: 一句话:左手右手一个慢动作,右手左手慢动作重播
    1、因为是无序队列,所以位置可以随机挑

    2、临时划分一个空间,存放我们挑选出来的中间元素

    3、左标签位置空,移动右标签,反之一样

    4、重复3,直到左右侧标签指向同一个位置,

    5、把临时存放的中间元素,归位

    """
    1.原理:挑元素、换分组、分组重复前两步
    2.
    换分组:准备工作 + 左右移动 + 元素归位
    递归: 函数自调用 + 退出条件
    """
    def quick_sort(alist, start, end):
        # 定义递归的条件
        if start < end:
            # 定义三个标签
            mid = alist[start]
            left = start
            right = end
    
            # 定义拆分的条件
            while left < right:
                # 右推进(右边的值大于等于中间值)
                while left < right and alist[right] >= mid:
                    right -= 1
    
                alist[left] = alist[right]
    
                # 左推进(左边的值小于中间值)
                while left < right and alist[left] < mid:
                    left += 1
    
                alist[right] = alist[left]
    
            # 获取中间值
            alist[left] = mid
    
            # 1.对切割后的左边的小组进行快速排序
            quick_sort(alist, start, left - 1)
    
            # 2.对切割后右边的小组进行快速排序
            quick_sort(alist, left + 1, end)
    
    
    if __name__ == "__main__":
        li = [54, 26, 93, 17, 77, 31, 44, 77, 20]
        print(li)
        quick_sort(li, 0, len(li) - 1)
        print(li)
    

    3. 列表去重

    list = [1, 1, 2, 2, 3, 4, 5, 5]
    new_list = set(list)
    print(new_list)
    
    
    def dislist(list):
        new_list = []
        if not list:
            return
        else:
            for i in list:
                if i not in new_list:
                    new_list.append(i)
                else:
                    continue
    
        return new_list
    
    
    print(dislist(list))
    
    # 以3为单位分组
    print([[x for x in range(1, 100)][i:i + 3] for i in range(0, 100, 3)])
    
    # 多个列表去重
    a = [1, 2, 3, 4, 5]
    b = [1, 2, 3]
    print(set(a) & set(b))  # 取相同值,后的集合
    print(set(a) ^ set(b))  # 取不同值,后的集合
    # 字符串反转
    string = 'hello world'
    
    print(string[::-1])
    

    4. 回文数

    a = (input("请输入一个数字:"))
    x = str(a)
    
    x = x[::-1]
    if x == a:
        print("True")
    
    else:
        print("False")
    
    

    5. 完数

    """
    题目:求指定区域内的完数(10000为例),及所有因子之和恰好等于本身,如:6=1+2+3
    1 将所有的因子追加到一个列表中
    2 将符合条件的数字打出来
    """
    l = []
    
    for n in range(1, 1000):
        for a in range(1, n):
            if n % a == 0:
                l.append(a)
        if sum(l) == n:
            print(l)
            print(n)
        l = []
    

    6.快速排序

    def quick_sort(alist, first, last):
        if first <= last:
            split_point = find_pos(alist, first, last)
            quick_sort(alist, first, split_point - 1)
            quick_sort(alist, split_point + 1, last)
    
    
    def find_pos(lists, low, high):
        key = lists[low]
    
        while low < high:
            while low < high and lists[high] >= key:
                high -= 1
    
            lists[low] = lists[high]
            while low < high and lists[low] <= key:
                low += 1
    
            lists[high] = lists[low]
    
        lists[low] = key
        return low
    
    
    alist = [54, 67, 98, 41, 34, 12, 34, 54, 64, 756]
    quick_sort(alist, 0, 9)
    print(alist)
    
    

    7. 斐波那契数列

    # 一、使用函数定义
    def finbo(num):
        numlist = [0, 1]
        for i in range(num - 2):
            numlist.append(numlist[-2] + numlist[-1])
    
        return numlist
    
    
    print(finbo(10))
    
    
    # 二、自定义迭代器对象
    class FeiBo(object):
        # 提供构造方法
        def __init__(self, num):
            self.num = num
            super(FeiBo, self).__init__()
            self.current_index = 0
            # 记录初始化的前两个值
            self.a = 0
            self.b = 1
    
        def __iter__(self):
            # 返回迭代对象
            return self
    
        def __next__(self):
            if self.current_index < self.num:
                result = self.a
                self.a, self.b = self.b, self.a + self.b
                # 下标加一
                self.current_index += 1
                return result
            else:
                raise StopIteration
    
    
    # 创建迭代器对象
    fib = FeiBo(10)
    
    for value in fib:
        print(value)
    
    

    8. 素数(质数)

    # 1。 获取素数
    import time
    
    start = time.clock()
    i = int(input('please enter  an integer:'))
    # 创建一个空list
    
    r = list()
    
    # 添加元素2
    r.append(2)
    
    # 从3开始挨个筛选
    for a in range(3, i):
        b = False
    
        # 用a除以小于a的质数b
        for b in r:
            if a % b == 0:
                b = False
                break
            else:
                b = True
        if b == True:
            r.append(a)
    print(r)
    t = (time.clock() - start)
    print(t)
    
    # 2。判断一个数字是否为素数
    num = int(input('please a num:'))
    
    if num % 2 == 0:
        print("不是素数!")
    elif num == 1:
        print("不是素数!")
    else:
        print("是一个素数!")
    

    9. 计算字符串中出现最多的字符,并打印

    # -*- coding: utf-8 -*-
    str_ = 'ssdasdasefadd'
    # 遍历所有的单词个数------运用浅拷贝、深拷贝
    dict_char_tmp = {i: str_.count(i) for i in str_}
    print("所有单词的个数:", dict_char_tmp)
    
    dict_char = {}
    for key, value in dict_char_tmp.items():
        if dict_char.get(value):
            # 如果有相同数量的value值,则key相同,添加到列表value中
            dict_char[value].append(key)
        else:
            dict_char[value] = [key]
    
    print(dict_char)
    # 使用Sorted函数给 字典key值 排序---转换为列表
    # dict.items()返回的是列表对象////dict.iteritems()返回的是 iterator 对象
    dict_char_sort = sorted(dict_char.items(), key=lambda item: item[0], reverse=True)
    print(dict_char_sort)
    
    char_l = dict_char_sort[0][1]
    
    print(char_l)
    char_l.sort()
    print("出现次数最多的字母是:", char_l[0], "个数是:", dict_char_sort[0][0])
    

    10.找出一个字符串中最长不重复的子串

    def find_long_no_repeat_substr(one_str):
        """
        找出一个字符串中最长不重复的子串
        :param one_str:
        :return:
        """
        res_list = []
        length = len(one_str)
        for i in range(length):
            tmp = one_str[i]
            for j in range(i + 1, length):
                if one_str[j] not in tmp:
                    tmp += one_str[j]
    
                else:
                    break
            res_list.append(tmp)
    
        res_list.sort(lambda x, y: cmp(len(x), len(y)))
        return res_list[-1]
    
    
    if __name__ == '__main__':
        one_str_list = ["1234", "asdfsfadgfdgahsftw", "34236547635132347"]
        for one_str in one_str_list:
            res = find_long_no_repeat_substr(one_str)
            print("{0}最长非重复字串为:{1}".format(one_str, res))
    
    

    相关文章

      网友评论

          本文标题:常见算法

          本文链接:https://www.haomeiwen.com/subject/fxvuiftx.html