1、选择排序

  • 时间复杂度:O(N^2)

  • 空间复杂度:O(1)

  • 不稳定

  • 思路:一开始,在[0, n-1]范围内选取一个最小的数放在0位置;第二次在[1, n-1]范围内选取一个最小的数放在1位置上;依次类推,直到访问到最后一个数,数组有序。

  • Python写法:

    def SelectionSort(arr):
      length = len(arr)
      for i in range(length):
          minIndex = i
          for j in range(i+1, length):
              if arr[j] < arr[minIndex]:
                  minIndex = j
              else:
                  minIndex = minIndex
          arr[i], arr[minIndex] = arr[minIndex], arr[i]
      return arr

2、冒泡排序

  • 时间复杂度:O(N^2)
  • 空间复杂度:O(1)
  • 稳定
def BubbleSort(arr):
    length = len(arr)
    if length < 2:
        return arr
    for i in range(length-1):
        for j in range(length-i-1):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
    return arr

3、插入排序

  • 时间复杂度:O(N^2)
  • 空间复杂度:O(1)
  • 稳定
def InsertSort(arr):
    length = len(arr)
    if length < 2:
        return arr
    for i in range(1, length):
        for j in range(i-1, -1, -1):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
    return arr

4、归并排序

  • 时间复杂度:O(NlogN)
  • 空间复杂度:O(N)
  • 稳定
def MergeSort(arr):
    length = len(arr)
    if length < 2:
        return arr
    process(arr, 0, length-1)
    return arr

def process(arr, left, right):
    if left == right:
        return
    mid = left + ((right - left + 1) >> 1)
    process(arr, left, mid)
    process(arr, mid+1, right)
    Merge(arr, left, mid, right)

def Merge(arr, left, mid, right):
    help = []
    p1 = left
    p2 = mid + 1
    while (p1 <= mid) and (p2 <= right):
        if arr[p1] <= arr[p2]:
            help.append(arr[p1])
            p1 += 1
        else:
            help.append(arr[p2])
            p2 += 1
    while p1 <= mid:
        help.append(arr[p1])
        p1 += 1
    while p2 <= right:
        help.append(arr[p2])
        p2 += 1
    for i in range(len(help)):
        arr[left+i] = help[i]
    return arr