wangyp

博客园 首页 联系 订阅 管理
如何写代码:  
  
    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.基数排序、桶排序、计数排序  基本用不到 用到再聊吧  桶排序可能会有  
  
  
  
                  
          
          
          
          
          
          
          
                  

  

posted on 2019-07-02 16:09  wangyp  阅读(262)  评论(0编辑  收藏  举报