经典排序

MJX2023/10/31其他算法 排序

冒泡排序

  1. n-1
  2. 从第一个开始往上无序区两两比较
  3. 一直重复直到有序
def bubble_sort(nums):
    for i in range(len(nums) - 1):
        for j in range(len(nums) - 1 - i):
            if nums[j] > nums[j + 1]:
                nums[j], nums[j + 1] = nums[j + 1], nums[j]             
# 检验
nums = [3, 5, 1, 1, 7, 9, 4]
bubble_sort(nums)
print(nums)

选择排序

  1. n-1
  2. i 趟时,第 i 个待比较
  3. 从无序区选出最小数,和 i 比较
  4. 交换直到有序
def select_sort(nums):
    for i in range(len(nums) - 1):
        min_loc = i
        for j in range(i + 1, len(nums)):
            if nums[j] < nums[min_loc]:
                min_loc = j
        nums[i], nums[min_loc] = nums[min_loc], nums[i]

插入排序

  1. 第一个数有序,共 n-1
  2. 从无序区选出拿出第一个数
  3. 从有序区最后开始遍历并往后移动一位,直到遇到第一个比它小的数
  4. 放在这个数后面
  5. 循环直到有序
def insert_sort(nums):
    for i in range(1, len(nums)):
        temp = nums[i]
        j = i - 1
        while j >= 0 and temp < nums[j]:
            nums[j + 1] = nums[j]
            j -= 1
        nums[j + 1] = temp

快速排序

  1. 确定划分边界 x
  2. 将数组分为 <=x>=x 的两个小数组
  3. 分别递归两个数组
def quick_sort(nums, l, r):
    if l >= r: return

    i, j = l - 1, r + 1
    x = nums[l + r >> 1]  # 取中间值
    while i < j:
        i += 1  # 交换完一趟后还能往后走
        while nums[i] < x:
            i += 1
        j -= 1
        while nums[j] > x:
            j -= 1
        if i < j:
            nums[i], nums[j] = nums[j], nums[i]        
	quick_sort(nums, l, j)
    quick_sort(nums, j + 1, r)

归并排序

  1. 将待排序的序列分成两部分(递归地)
  2. 将排好序的两部分合并起来
def merge_sort(nums, l, r):                           
    if l >= r: return

    mid = l + r >> 1                                  
    merge_sort(nums, l, mid)                          
    merge_sort(nums, mid + 1, r)                      
    i, j, tmp = l, mid + 1, []
    while i <= mid and j <= r:                        
        if nums[i] < nums[j]:                         
            tmp.append(nums[i])                       
            i += 1                                    
        else:                                         
            tmp.append(nums[j])                       
            j += 1                                    
    tmp += nums[i: mid + 1]                           
    tmp += nums[j: r + 1]                             
    nums[l: r + 1] = tmp                              

快排归并都属于分治算法,分治算法都有三步:

  1. 分成子问题
  2. 递归处理子问题
  3. 子问题合并