zoukankan      html  css  js  c++  java
  • 数据结构和算法之查找和排序1

    如何写代码:  
      
        01.提炼问题  要明确需求  
        02.分析问题 -->动脑子  产出:思路报告  即我是怎么想到的  
        03.落实到代码  
        04.实例测试  看看能否满足需求 如果不能那么请debug  
        05.时间和空间复杂度   
      
      
    目的:  
      
        算法的入门篇 10种排序算法和3种查找算法   
          
    参考:  
      
        《数据结构和算法  python语言描述》  
          
    查找:  
        01.线性查找   
            def seq_find(array,target):  
                  
                found = False  
                  
                for ele in array:  
                    if ele == target:  
                        found = True  
                return found  
        02.二分查找  
            def binary_search(array,target)  
                  
                found = False  
                start = 0  
                end = len(array) -1  
                  
                while first <= last and not found:  
                    middle = (start+end) //2  
                    if array[middle] == target:  
                        found = True  
                    else:  
                        if array[middle] > target:  
                            end = middle -1  
                        else:  
                            start = middle + 1  
                return found  
                  
        03.hash查找  
          
            hash查找知道时间复杂度是1就可以了吧?常用的hash取余的算法  还是解决冲突的算法 没必要了  
      
    排序:01-04是简单的排序  05-07是复杂排序  08-10是线性排序  
      
        01.插入排序  
          
            提炼问题:很明确,要求我们通过插入的方式实现排序,重点在插入  
            分析问题:首先第一个元素是有序的,那么只需要将后续的元素插入到合适的位置即可;  
                      后续元素如何处理呢?比如pos=k的元素 只需要将该元素的值提炼出来 依次和前边的元素pos-1进行比较,直至pos>0或者lst[pos-1]< value of k  
                        
              
            代码:  
              
            def insert_sort(lst):  
                  
                for index in range(1,len(lst)):  
                  
                    pos = index  
                    val = lst[index]  
                      
                    while pos >0 and val < lst[pos-1]:  
                        lst[pos] = lst[pos-1]  
                        pos = pos -1  
                      
                    lst[pos] = val  
            测试:  
            array = [25,67,54,33,20,78,65,49,17,56,44]  
            insert_sort(array)  
            print array  
              
            时间和空间复杂度:O(n**2)  O(1)  
              
        02.冒泡排序  
          
            提炼问题:像冒泡一样 相邻元素两两比较 直至最大的到最后  
            分析问题:以N个元素的列表为例,需要进行N-1次冒泡,第一次冒泡需要N-1次比较  第二次冒泡需要比较N-2次 第N-1次需要比较1次  
              
            代码:  
            def bubble_sort(lst):  
                  
                pass_num = len(lst)-1  
                  
                for num in range(pass_num,0,-1):  
                      
                    for i in range(num):  
                        if lst[i] > lst[i+1]:  
                            lst[i],lst[i+1] = lst[i+1],lst[i]  
            测试:  
            array = [25,67,54,33,20,78,65,49,17,56,44]  
            bubble_sort(array)  
            print array  
              
            时间和空间复杂度:O(n**2)  O(1)  
                  
        03.选择排序  
          
            提炼问题:重在选择   
            分析:假设index=0的元素值最大,遍历一遍 选出最大的放到末尾  如此遍历N次  
            代码:  
            def insert_sort(lst):  
                for index in range(1, len(lst)):  
      
                    pos = index  
                    val = lst[index]  
      
                    while pos > 0 and val < lst[pos - 1]:  
                        lst[pos] = lst[pos - 1]  
                        pos = pos - 1  
      
                    lst[pos] = val  
            测试:  
                      
            array = [25, 67, 54, 33, 20, 78, 65, 49, 17, 56, 44]  
            insert_sort(array)  
            print array  
              
            时间和空间复杂度:O(n**2)  O(1)  
        04.  
      
                  
              
              
              
              
              
              
            如何写代码:  
      
        01.提炼问题  要明确需求  
        02.分析问题 -->动脑子  产出:思路报告  即我是怎么想到的  
        03.落实到代码  
        04.实例测试  看看能否满足需求 如果不能那么请debug  
        05.时间和空间复杂度   
      
      
    目的:  
      
        算法的入门篇 10种排序算法和3种查找算法   
          
    参考:  
      
        《数据结构和算法  python语言描述》  
          
    查找:  
        01.线性查找   
            def seq_find(array,target):  
                  
                found = False  
                  
                for ele in array:  
                    if ele == target:  
                        found = True  
                return found  
        02.二分查找  
            def binary_search(array,target)  
                  
                found = False  
                start = 0  
                end = len(array) -1  
                  
                while first <= last and not found:  
                    middle = (start+end) //2  
                    if array[middle] == target:  
                        found = True  
                    else:  
                        if array[middle] > target:  
                            end = middle -1  
                        else:  
                            start = middle + 1  
                return found  
                  
        03.hash查找  
          
            hash查找知道时间复杂度是1就可以了吧?常用的hash取余的算法  还是解决冲突的算法 没必要了  
      
    排序:01-04是简单的排序  05-07是复杂排序  08-10是线性排序  
      
        01.插入排序  
          
            提炼问题:很明确,要求我们通过插入的方式实现排序,重点在插入  
            分析问题:首先第一个元素是有序的,那么只需要将后续的元素插入到合适的位置即可;  
                      后续元素如何处理呢?比如pos=k的元素 只需要将该元素的值提炼出来 依次和前边的元素pos-1进行比较,直至pos>0或者lst[pos-1]< value of k  
                        
              
            代码:  
              
            def insert_sort(lst):  
                  
                for index in range(1,len(lst)):  
                  
                    pos = index  
                    val = lst[index]  
                      
                    while pos >0 and val < lst[pos-1]:  
                        lst[pos] = lst[pos-1]  
                        pos = pos -1  
                      
                    lst[pos] = val  
            测试:  
            array = [25,67,54,33,20,78,65,49,17,56,44]  
            insert_sort(array)  
            print array  
              
            时间和空间复杂度:O(n**2)  O(1)  
              
        02.冒泡排序  
          
            提炼问题:像冒泡一样 相邻元素两两比较 直至最大的到最后  
            分析问题:以N个元素的列表为例,需要进行N-1次冒泡,第一次冒泡需要N-1次比较  第二次冒泡需要比较N-2次 第N-1次需要比较1次  
              
            代码:  
            def bubble_sort(lst):  
                  
                pass_num = len(lst)-1  
                  
                for num in range(pass_num,0,-1):  
                      
                    for i in range(num):  
                        if lst[i] > lst[i+1]:  
                            lst[i],lst[i+1] = lst[i+1],lst[i]  
            测试:  
            array = [25,67,54,33,20,78,65,49,17,56,44]  
            bubble_sort(array)  
            print array  
              
            时间和空间复杂度:O(n**2)  O(1)  
                  
        03.选择排序  
          
            提炼问题:重在选择   
            分析:假设index=0的元素值最大,遍历一遍 选出最大的放到末尾  如此遍历N次  
            代码:  
            def insert_sort(lst):  
                for index in range(1, len(lst)):  
      
                    pos = index  
                    val = lst[index]  
      
                    while pos > 0 and val < lst[pos - 1]:  
                        lst[pos] = lst[pos - 1]  
                        pos = pos - 1  
      
                    lst[pos] = val  
            测试:  
                      
            array = [25, 67, 54, 33, 20, 78, 65, 49, 17, 56, 44]  
            insert_sort(array)  
            print array  
              
            时间和空间复杂度:O(n**2)  O(1)  
        04.希尔排序  
          
            不是重点  不写了 有空再补上吧  
        05.归并排序  
          
            提炼问题:8 4 2 1  
            分析:两两合并 然后递归  
            代码:  
            def merge(list_l,list_r):  
      
                point_l = 0  
                point_r = 0  
      
                res = []  
                while point_l < len(list_l) and point_r < len(list_r):  
                    if list_l[point_l] < list_r[point_r]:  
                        res.append(list_l[point_l])  
                        point_l += 1  
                    else:  
                        res.append(list_r[point_r])  
                        point_r += 1  
                res +=   list_l[point_l:]  
                res +=   list_r[point_r:]  
      
      
      
                return res  
      
            def merge_sort(lst):  
      
                if len(lst) <= 1:  
                    return lst  
                middle = len(lst)//2  
                left = merge_sort(lst[:middle])  
                right = merge_sort(lst[middle:])  
      
                return merge(left,right)  
      
            array = [25,67,54,33,20,78,65,49,17,56,44]  
            print merge_sort(array)  
          
        06.快速排序  
          
            代码:  
            # -*- coding:utf-8 -*-  
      
            def quick_sort(lst):  
                quick_sort_rec(lst,0,len(lst)-1)  
            def quick_sort_rec(lst,first,last):  
      
                if first < last:  
                    split_point = partition(lst,first,last)  
                    quick_sort_rec(lst,first,split_point-1)  
                    quick_sort_rec(lst,split_point+1,last)  
            def partition(lst,first,last):  
                pivot_value = lst[first]  
                left_mark = first + 1  
                right_mark = last  
                done = False  
                while not done:  
                    while left_mark <= right_mark and lst[left_mark] <= pivot_value:  
                        left_mark = left_mark + 1  
                    while lst[right_mark] >= pivot_value and right_mark >= left_mark:  
                        right_mark = right_mark - 1  
                    if right_mark < left_mark:  
                        done = True  
                    else:  
                        temp = lst[left_mark]  
                        lst[left_mark] = lst[right_mark]  
                        lst[right_mark] = temp  
                temp = lst[first]  
                lst[first] = lst[right_mark]  
                lst[right_mark] = temp  
                return right_mark  
      
            array = [54, 26, 93, 17, 77, 31, 44, 55, 20]  
            quick_sort(array)  
            print array  
        07.堆排序  
            留到二叉树部分  
        08-10.基数排序、桶排序、计数排序  基本用不到 用到再聊吧  桶排序可能会有  
      
      
      
                      
              
              
              
              
              
              
              
                      
    

      

  • 相关阅读:
    Wannafly挑战赛9
    acm之图论基础
    Codeforces Round #459 (Div. 2)
    Codeforces Round #460 (Div. 2)
    浙南联合训练赛20180129
    AtCoder Regular Contest 090
    牛客练习赛11
    2018年1月26日天梯赛练习1
    csa Round #66 (Div. 2 only)
    EOJ Monthly 2018.1
  • 原文地址:https://www.cnblogs.com/wanyp/p/11121319.html
Copyright © 2011-2022 走看看