跳转至

排序(sort)

排序是将无序列表排序成有序列表的操作。排序有升序 ascending order 和降序 descending order 之分。

常见排序算法

  1. 冒泡排序 Bubble sort
  2. 选择排序 Selection sort
  3. 插入排序 Insertion sort
  4. 快速排序 Quick sort
  5. 堆排序
  6. 归并排序
  7. 希尔排序
  8. 计数排序
  9. 基数排序

1.冒泡排序 bubble sort

比较列表中两个相邻数,如果前面比后面大(升序排序),则交换两个数。
冒泡排序每运行一个循环,列表有序区大小变大一个,无序区大小减小一个。每次只对无序区排序。初始时,整个列表都是无序区。

因为当无序区只剩一个时,不用再排序,所以整个冒泡排序需要运行 \( n-1 \) 次循环。时间复杂度为 \( O(n^2) \)

冒泡排序的关键: 循环次数无序区范围

代码实现

# python
def bubble_sort(li: list):
    # ascending order
    loopTimes = len(li) - 1
    for i in range(loopTimes):
        for j in range(0 , loopTimes - i):
            if li[j] > li[j+1]:
                li[j] , li[j+1] = li[j+1] , li[j]

改进

若某次循环中,没有发生交换,则说明排序已经完成。可以使用一个变量作为标志位来改进算法。

实现如下:

# python
def bubble_sort(li: list):
    # ascending order
    loopTimes = len(li) - 1
    for i in range(loopTimes):
        exchange = False
        for j in range(0 , loopTimes - i):
            if li[j] > li[j+1]:
                exchange = True
                li[j] , li[j+1] = li[j+1] , li[j]
        if not exchange:
            break

2.选择排序 selection sort

循环遍历 \( n \) 次列表( \( n \) 为列表规模)。每次寻找无序区的最小值(升序排序),并按照顺序依次与第 \( i \) 个交换( \( i \) 表示第几大的数),并缩小无序区。

代码实现

# python
def sort(li: list):
    for i in range(len(li) - 1):
        minValue = min(li[i:])
        minIndex = li.index(minValue , i)
        li[i] , li[minIndex] = li[minIndex] , li[i]