數據結構和算法之查找和排序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.基數排序、桶排序、計數排序  基本用不到 用到再聊吧  桶排序可能會有  
  
  
  
                  
          
          
          
          
          
          
          
                  
相關文章
相關標籤/搜索