zoukankan      html  css  js  c++  java
  • sort(排序)

    排序和查找

    排序

      排序(Sort)是将无序的记录序列(或称文件)调整成有序的序列。

    * 冒泡排序

      冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成

        def bubbke(self):
            """
            冒泡排序
            :return:
            """
            # 外层循环表示比较多少轮
            for i in range(len(self.list_) - 1):
                # 内层循环表示每轮比较的次数
                for j in range(len(self.list_) - i - 1):
                    # 前一个数比后一个数大则交换位置
                    if self.list_[j] > self.list_[j + 1]:
                        self.list_[j], self.list_[j + 1] = self.list_[j + 1], self.list_[j]
    if __name__ == "__main__":
        l = [4, 8, 71, 2, 3, 1, 9]
        sr.bubbke()
        print(sr.list_)

    * 选择排序

      工作原理为,首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕。

       def select(self):
            """
            选择排序
            :return:
            """
            # 外层循环表示比较多少轮
            for i in range(len(self.list_) - 1):
                min = i
                for j in range(i + 1, len(self.list_)):
                    if self.list_[min] > self.list_[j]:
                        min = j
                if i != min:
                    self.list_[i],self.list_[min] = 
                    self.list_[min], self.list_[i]
    if __name__ == "__main__":
        l = [4, 8, 71, 2, 3, 1, 9]
        sr.select()

    * 插入排序

      对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

        def insert(self):
            """
            插入排序
            :return:
            """
            for i in range(1,len(self.list_)):
                x = self.list_[i]
                j = i
                while j>0 and self.list_[j-1] > x:
                    self.list_[j] = self.list_[j-1]
                    j -= 1
                self.list_[j] = x
    if __name__ == "__main__":
        l = [4, 8, 71, 2, 3, 1, 9]
        sr.insert()

    * 快速排序

     步骤:
      1.从数列中挑出一个元素,称为 "基准"(pivot),
      2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一 边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
      3.递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

     #一轮交换
        def sub_sort(self,low,high):
            key = self.list_[low]
            while low < high:
                #后面的数向前移动
                while low < high and self.list_[high] >= key:
                    high -= 1
                self.list_[low] = self.list_[high]
                #前面的数向后移动
                while low < high and self.list_[low] < key:
                    low += 1
                    self.list_[high] = self.list_[low]
                self.list_[low] = key
                return low
    
        def quick(self,low,high):
            """
            快速排序
            :param low: 列表开头元素索引
            :param high: 列表结尾元素索引
            :return:
            """
            if low < high:
                key = self.sub_sort(low,high)
                self.quick(low,key - 1)
                self.quick(key + 1,high)
    if __name__ == "__main__":
        l = [4, 8, 71, 2, 3, 1, 9]
        sr = Sort(l)
  • 相关阅读:
    《Unity3D-设置子弹发射的代码》
    《Unity3D-控制角色受伤的时候身体颜色变化的代码》
    《Unity3D-鼠标控制游戏人物的方向的代码》
    C++基础学习笔记001
    C++学习笔记
    JSON中使用jsonmapper解析的代码和步骤 学习笔记
    JSON学习笔记
    FileInfo文件的一些操作代码
    UDPClient的服务端和客户端的通信代码
    TCPListener和TCPClient之间的通信代码
  • 原文地址:https://www.cnblogs.com/Acekr/p/10939830.html
Copyright © 2011-2022 走看看