• Python常用的排序


    排序

    冒泡排序

    冒泡排序(英语:Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

    冒泡排序算法的运作如下:

    • 比较相邻的元素。如果第一个比第二个大(升序),就交换他们两个。
    • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
    • 针对所有的元素重复以上的步骤,除了最后一个。
      持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-\
    
    
    def bubble_sort(alist):
        """Sort the elements with Bubble method
    
        :aList: one list
        :returns: List with sorted values
    
        """
        for i in range(len(alist)-1, 0, -1):
            for j in range(i):
                if alist[j] > alist[j+1]:
                    temp = alist[j+1]
                    alist[j+1] = alist[j]
                    alist[j] = temp
    
    
    if __name__ == "__main__":
        one_list = [54, 26, 93, 17, 77, 31, 44, 55]
        bubble_sort(one_list)
        print(one_list)
    

    选择排序

    选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

    选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    
    def selection_sort(alist):
        """TODO: Docstring for selection_sort.
        :returns: TODO
    
        """
        n = len(alist)
    
        for i in range(n-1):
            # record the index of the min value
            min_index = i
    
            # pick the min value from the i+1 to max index
            for j in range(i+1, n):
                if alist[j] < alist[min_index]:
                    min_index = j
    
            # if data is not in the true index, exchange them
            if min_index != i:
                alist[i], alist[min_index] = alist[min_index], alist[i]
                # temp = alist[min_index]
                # alist[min_index] = alist[i]
                # alist[i] = temp
    
    
    if __name__ == "__main__":
        test_list = [2, 7, 12, 0, 8, 22, 1]
        selection_sort(test_list)
        print(test_list)
    

    快速排序

    快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

    步骤为:

    • 从数列中挑出一个元素,称为"基准"(pivot),
    • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
    • 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
    def quick_sort(alist, start, end):
        """快速排序"""
    
        # 递归的退出条件
        if start >= end:
            return
    
        # 设定起始元素为要寻找位置的基准元素
        mid = alist[start]
    
        # low为序列左边的由左向右移动的游标
        low = start
    
        # high为序列右边的由右向左移动的游标
        high = end
    
        while low < high:
            # 如果low与high未重合,high指向的元素不比基准元素小,则high向左移动
            while low < high and alist[high] >= mid:
                high -= 1
            # 将high指向的元素放到low的位置上
            alist[low] = alist[high]
    
            # 如果low与high未重合,low指向的元素比基准元素小,则low向右移动
            while low < high and alist[low] < mid:
                low += 1
            # 将low指向的元素放到high的位置上
            alist[high] = alist[low]
    
        # 退出循环后,low与high重合,此时所指位置为基准元素的正确位置
        # 将基准元素放到该位置
        alist[low] = mid
    
        # 对基准元素左边的子序列进行快速排序
        quick_sort(alist, start, low-1)
    
        # 对基准元素右边的子序列进行快速排序
        quick_sort(alist, low+1, end)
    
    
    alist = [54,26,93,17,77,31,44,55,20]
    quick_sort(alist,0,len(alist)-1)
    print(alist)
    

    查找

    无序表查找

    数据不排序的线性查找,遍历数据元素。
    算法分析:最好情况是在第一个位置就找到了,此为O(1);最坏情况在最后一个位置才找到,此为O(n);所以平均查找次数为(n+1)/2。最终时间复杂度为O(n)

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    
    def sequential_search(lis, key):
        """search one key in one sequential with unordered.
        :lis: one list
        :key: the search value
        :returns: index
    
        """
        length = len(lis)
        for i in range(length):
            if lis[i] == key:
                return i
        else:
            return False
    
    
    if __name__ == "__main__":
        origin_list = [1, 5, 8, 123, 22, 54, 7, 99, 300, 222]
        result = sequential_search(origin_list, 44)
        print(result)
    

    二分法查找

    二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

    • 首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;
    • 否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
    • 重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
    # 非递归实现
    
    def binary_search(alist, item):
          first = 0
          last = len(alist)-1
          while first<=last:
              midpoint = int((first + last)/2)
              if alist[midpoint] == item:
                  return True
              elif item < alist[midpoint]:
                  last = midpoint-1
              else:
                  first = midpoint+1
        return False
    
    testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42,]
    print(binary_search(testlist, 3))
    print(binary_search(testlist, 13))
    
    ## 递归实现
    def binary_search(alist, item):
        if len(alist) == 0:
            return False
        else:
            midpoint = len(alist)//2
            if alist[midpoint]==item:
              return True
            else:
              if item<alist[midpoint]:
                return binary_search(alist[:midpoint],item)
              else:
                return binary_search(alist[midpoint+1:],item)
    
    testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42,]
    print(binary_search(testlist, 3))
    print(binary_search(testlist, 13))
    
  • 相关阅读:
    [Java123] JDBC and Multi-Threading 多线程编程学习笔记
    3:2D装换 [ 重点 ]
    2:属性选择器 + 结构伪类选择器 + 伪元素
    1:新增 H5 常用属性
    day2
    代码实操第一天
    1 滑动门
    css高级技巧
    11:网页布局总结
    10:定位
  • 原文地址:https://www.cnblogs.com/Tcorner/p/9115892.html
Copyright © 2020-2023  润新知