zoukankan      html  css  js  c++  java
  • python 实现排序算法

    一、冒泡排序

    原理:依次比较相邻的两个数,将小数放在前面,大数放在后面。即首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。

    def bubble_sort(data):
      for i in range(len(data)-1):
        for j in range(len(data)- i -1):
          if data[j]<data[j + 1]:
            data[j], data[j + 1] = data[j + 1], data[j]

    二、插入排序

    原理:有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序。

    def insert_sort(data):
      for i in range(1, len(data)):
        tmp = data[i]
        j = i - 1
        while j>=0 and data[j] > tmp:
          data[j],data[j + 1] = data[j + 1],data[j]
          j -= 1
        data[j + 1] = tmp

    三、选择排序

    原理:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

    def select_sort(data):
      for i in range(len(data)-1):
        min_num = i
        for j in range(i+1, len(data)):
          if data[j]<data[i]:
            min_num = j
          data[i], data[min_num] = data[min_num], data[i]

    四、快速排序

    原理:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

    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


    五、堆排序

    原理:堆积排序(Heapsort)是指利用堆积树(堆)这种资料结构所设计的一种排序算法,可以利用数组的特点快速定位指定索引的元素。

    def sift(data,low,high):
      i = low
      j = 2*i + 1
      tmp = data[i]
      while j <= high: # 只要没到最后根最后
        if j < high and data[j] < data[j + 1]: # 是否有右孩子,且右孩子大于左孩子
          j = j + 1 # j 成为最大孩子的下标
        if tmp < data[j]: # 最大的孩子是否大于父亲
          data[i] = data[j] # 子孩子上位
          i = j # 重新赋值下标
          j = 2*i + 1
        else: # 上述条件都不满足,跳出循环
          break
      data[i] = tmp

    def heap_sort(data):
      n = len(data)
      for i in range(n // 2 -1 ,-1,-1):
        sift(data,i,n-1)
      for i in range(n-1,-1,-1):
        data[0],data[i] = data[i],data[0]
        sift(data,0,i-1)

  • 相关阅读:
    CodeForces 408E Curious Array(组合数学+差分)
    CodeForces 519E A and B and Lecture Rooms(倍增)
    洛谷 4051 [JSOI2007]字符加密(后缀数组)
    哇,两门学考都是A(〃'▽'〃)
    BZOJ 1977 严格次小生成树
    XJOI 3606 最大子矩形面积/LightOJ 1083 Histogram(单调栈/笛卡尔树)
    XJOI 3629 非严格次小生成树(pqq的礼物)
    XJOI 3363 树4/ Codeforces 739B Alyona and a tree(树上差分+路径倍增)
    [转载]别让用户发呆—设计中的防呆策略
    Linux下的链接文件
  • 原文地址:https://www.cnblogs.com/niansi/p/8053181.html
Copyright © 2011-2022 走看看