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)

 

posted @ 2019-05-28 19:51  爱吃西红柿的猫  阅读(1225)  评论(0编辑  收藏  举报