新手学习python(十三)算法

算法(Algorthm):一个计算过程,解决问题的方法。

时间复杂度是用来估计算法运行时间的一个式子(单位)。M个循环,复杂度就是N的M次方。(例如2个for循环,时间复杂度就是N的平方)

空间复杂度是用来评估算法占用内存大小的一个式子。

(1)列表排序:将无序的列表变成有序列表。

应用场景:各种榜单、各种表单、给二分排序用、给其他算法用

A、冒泡排序

思路:相邻的两个数两两对比,如果前面的数大于后面的数,则把前面的数和后面的交换。每一轮排序,最大的数置于最后。

def bubble_sort(li):

     for i in range(len(li) -1):

           exchange = False     #加个优化

           for j in range(len(li) -i -1):

                 if li[ j ] > li[ j+1 ]:

                      li[ j ],li [ j+1 ] = li [ j+1 ],li[ j ]

                       exchange = True      #加个优化

           if not exchange:

                return             #加个优化,如果冒泡排序中执行一趟而没有交换,则表示列表已经是有序状态,可以直接结束算法

B、选择排序

思路:一趟遍历记录最小的数,放到第一个位置;再一趟遍历记录剩余列表中最小的数,继续放置。

for select_sort(li):

      for i in range(len(li) -1):

            min_loc = i

            for j in range(i+1,len(li)):

                  if li[ j ] < li[ min_loc ]:

                     min_loc = j

            if min_loc != i:

                  li[ i ],li[ min_loc ] = li[ min_loc],li[ i ]

C、插入排序

思路:列表被分为有序区和无序区两个部分,最初有序区只有一个元素;每次从无序区选择一个元素,插入到有序区的位置,直到无序区变空。

def insert_sort(li):

      for i in range(1,len(li)):   #从1开始排序(注意:下标是从0开始)

            tmp = li[ i ]

            j = i -1

            while j >= 0 and tmp < li[ j ]:

                   li[ j +1 ] = li[ j ]

                     j = j - 1

             li[ j+1 ] = tmp 

D、快速排序

思路:取一个元素P(第一个元素),使P归位;

          列表被P分成两部分,左边都比P小,右边都比P大;

           递归完成排序。

def quick_sort(data,left,right):     #递归

       if left < right:

           mid = partition(data,left,right)

           quick_sort(data,left,mid-1)

           quick_sort(data,mid+1,right)

def partition(data,left,right):           #使元素归位

       tmp = data[left]

       while left < right:

              while left < right and data[right] >=tmp:

                     right -= 1

              data[left] = data[right]

              while left < right and data[left] <=tmp:

                     left +=1

              data[right] = data[left]

         data[left] = tmp

         return left

 

posted @ 2018-10-25 22:04  bianbian1234  阅读(155)  评论(0编辑  收藏  举报