排序算法

 
 
  1. #==============================================================================
  2. # # -*- coding: utf-8 -*-
  3. # """
  4. # Created on Mon Feb 20 10:48:50 2017
  5. #
  6. # @author: zzpp220
  7. # """
  8. '''排序算法---
  9. 快速排序'''
  10. __metadata__=type
  11. #==============================================================================
  12. class QuickSort:
  13.     ##单指针方法,把首元素最作为基准,顺序遍历,小于他的弹出,然后插入数组首位
  14.     def singpoi_partition(self,arr,first,end):
  15.         ##要判断first 的关系,当只有一个元素和没有元素的时候,就返回
  16.         if first<end:
  17.             key=arr[first]
  18.            
  19.             for i in range(first+1,end+1):##以第一个作为key
  20.                 if arr[i] < key:
  21.                     arr.insert(first,arr.pop(i))
  22.             index_key=arr.index(key)
  23.             self.singpoi_partition(arr,first,index_key-1)
  24.             self.singpoi_partition(arr,index_key+1,end)
  25.            
  26.         return None
  27.    #双指针方法
  28. #     def quick_sort(array,low,high):
  29. #        if low < high:
  30. #            key_index = sub_sort(array,low,high)
  31. #            quick_sort(array,low,key_index)
  32. #            quick_sort(array,key_index+1,high)
  33. #            
  34. #     def sub_sort(array,low,high):
  35. #         key = array[low]
  36. #         while low < high:
  37. #             while low < high and array[high] >= key:
  38. #                 high -= 1
  39. #             while low < high and array[high] < key:
  40. #                 array[low] = array[high]
  41. #                 low += 1
  42. #                 array[high] = array[low]
  43. #         array[low] = key
  44. #         return low        
  45.            
  46. #==============================================================================
  47. '''归并排序'''
  48. class Recur_Order:
  49.    
  50.    def recur_Order(self,arr):##给一个大的数组,要依次进行递归
  51. ##1、先定义当递归到最细的时候,特殊情况的返回值是啥'''
  52.        if len(arr) <=1:
  53.            return arr
  54.   #2、再给出一般情况下从最大的数组开始按照什么样的规则分成两半'''        
  55.        mid=(len(arr)-1)//2
  56.        first=arr[:mid+1]
  57.        second=arr[mid+1:]
  58.    #3、分好之后,将两半分别递归使用上面的规则,直到最细的情况下返回我们定义的值(或者是数组或者是None),就跳回上一层,'''
  59.        one=self.recur_Order(first)
  60.        two=self.recur_Order(second)
  61.     #4、在跳回来之后,就返回到一般情况上来,下面就要给出一般情况下,该如何操作,以及一般情况下我们要的返回值是什么(就是res)'''  
  62.        return self.sub_order(one,two)
  63.        
  64.    def sub_order(self,first,second):
  65.        i,j=0,0
  66.        res=[]
  67.      #4.1 先判断参数的边界情况,定义出非边界是的操作 如果两个数组都存在,并且递增的下标没有过界 '''
  68.        while first and second and i<len(first) and j<len(second):
  69.            #4.1.1 判断对应下标的值的大小first[i] ? second[j],如果成立,把最小的放到res,然后比较最小的元素所在的序列的中下一个和比较时较大的那个再比较大小,若最小的依然是first,继续走'''
  70.            while i<len(first) and j<len(second) and first[i] <=second[j]:
  71.                res.append(first[i])
  72.                i+=1
  73.            #4.1.2 如果上面不满足 就反过来,操作相似'''
  74.            while i<len(first) and j<len(second) and first[i] >second[j]:
  75.                res.append(second[j])
  76.                j+=1
  77.        #4.2两个序列满足不为空,一个序列循环完后(标志是下标增长到了序列的长度)而另一个还有剩下的时候(下标依旧小于本序列的长度),就把身下的全加到res里  '''      
  78.        if first and second:                    
  79.                res+=first[i:] if i <len(first) else second[j:]#是等号之后的表达式
  80.        #4.3 最后给出一般情况下,以及两个序列有一个为空时的,要返回的值'''
  81.        return res
  82. #=========================insert_sort=========================        
  83. class Insert_Order:
  84.    def insert_order(self,arr):
  85.        if not arr:
  86.            return None
  87.        if len(arr)<=1:
  88.            return arr
  89.        res=[]
  90.        ##先把首字母放进去
  91.        res.append(arr[0])
  92.        i,j=1,-1
  93.        while i<len(arr):
  94.            #循环比较数组中的下一个元素和res的最后元素比较,若大或相等直接加入,再比较下一份
  95.            while i<len(arr) and arr[i]>=res[-1]:
  96.                res.append(arr[i])
  97.                i+=1
  98.            #如果小于 则依次比较和res中的倒数第下一个元素计较
  99.            while i<len(arr) and j>=-len(res) and arr[i]<res[j]:
  100.                j-=1
  101.                #如果大于或者等于他,即直接插在他后面,然后i+1
  102.                if j>=-len(res) and arr[i]>=res[j]:
  103.                    res.insert(j+1,arr[i])
  104.                    j=-1
  105.                    i+=1
  106.                    break
  107.            #如果一直遍历到res的头也没发现比他更小的,就直接插在他前面
  108.            if j<=-len(res):
  109.               res.insert(j+1,arr[i])
  110.               j=-1
  111.               i+=1
  112.        return res
  113. #'''不是说插入排序就是一个一个插入,更简单的方法如下,顺序遍历元素,挑出剩余最小的,然后和当前的互换位置,注意如果有值相同的条件,因此index要从i+开始 这一点要注意 还有就是判断i+1是否有意义,是否超出了l的边界,遍历完成后,返回的即为排序好的'''
  114.    def easier_insert_sort(self,l):
  115.        
  116.        for i in range(len(l)):
  117.            min_index=l.index(min(l[i+1:]),i+1) if i < (len(l)-2) else l.index(min(l[i:]))
  118.            l[i],l[min_index]=l[min_index],l[i]
  119.            
  120.        return l
  121.        
  122. def bubble(arr):
  123.    if not arr:
  124.        return None
  125.    for t in range(len(arr)):
  126.        for i in range(len(arr)-1-t):
  127.            if arr[i]<=arr[i+1]:
  128.                pass
  129.            else:
  130.              arr[i],arr[i+1]=arr[i+1],arr[i]  
  131.        print arr
  132.    return arr
  133. if __name__=='__main__':
  134.    arr=[10,4,7,-4,12,5,-23,5,34,7,23,75,2,0]
  135.    l = [4,1,9,13,34,26,10,7,4]
  136. #==============================================================================
  137. #     solution=QuickSort()
  138. #     solution.singpoi_partition(arr,0,len(arr)-1)
  139. #     print arr
  140. #    solution=Recur_Order()
  141. #   print solution.recur_Order(arr)    
  142. #==============================================================================
  143.    solution=Insert_Order()
  144.    #print solution.insert_order(l)#None [] [1]    
  145.    #print solution.easier_insert_sort(l)
  146.    print bubble(arr)


附件列表

     

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值