排序算法的统一视角
本系列文章尝试从'问题拆分 + 基准情况 + 组合解'这个统一视角出发,理解各种排序。
从“问题拆分 + 基准情况 + 组合解”的统一视角出发,系统梳理了选择排序、冒泡排序、插入排序、归并排序、堆排序及快速排序六种常见算法。通过定义子问题、确定基准情况及组合策略,帮助读者深入理解各类排序算法的核心逻辑与实现差异。

本系列文章尝试从'问题拆分 + 基准情况 + 组合解'这个统一视角出发,理解各种排序。
selectionSort(arr, start):表示当前要排序的子区间是 arr[start...n-1]
初始子问题 (原问题)
selectionSort(arr, 0):表示当前要排序的子区间是 arr[0...n-1]
start >= n-1 表示当前要排序的子区间是 arr[start...n-1] 的长度为 0 或者 1。因为单个元素或者空集是有序的,所以该问题已解决,不用继续拆分了。
拆分前:selectionSort(arr, start)
目标:保证位置 start 对应的元素已在其最终位置上。
操作:从左向右遍历未排序区间,找到最小值,与未排序区间的首个元素交换
拆分后:selectionSort(arr, start+1)
无
bubbleSort(arr, start):表示当前要排序的子区间是 arr[start...n-1]
初始子问题 (原问题)
bubbleSort(arr, 0):表示当前要排序的子区间是 arr[0...n-1]
start >= n-1 表示当前要排序的子区间是 arr[start...n-1] 的长度为 0 或者 1。因为单个元素或者空集是有序的,所以该问题已解决,不用继续拆分了。
拆分前:bubbleSort(arr, start)
目标:保证位置 start 对应的元素已在其最终位置上。
操作:从右向左遍历未排序区间 arr[start...n-1],不断比较相邻元素,如果逆序就交换,最终使得最小值冒泡到该区间的左侧。
拆分后:bubbleSort(arr, start+1)
无
insertSort(arr, start):
arr[start...n-1]arr[0...start-1] 已有序初始子问题 (原问题):
insertSort(arr, 1):
arr[1...n-1]arr[0...0] 已有序,因为此时该区间只有 1 个元素。start >= n 表示当前要排序的子区间是 arr[n...n-1] 的长度为 0,且区间 arr[0...start-1] 已有序。因为空集是有序的,所以该问题已解决,不用继续拆分了。
拆分前:insertSort(arr, start)
目标:保证位置 start 对应的元素已在其最终位置上。
操作:取未排序区间 arr[start...n-1] 的首个元素 arr[start],从已有序区间 arr[0...start-1] 中找到其正确的插入位置,将其插入。
拆分后:insertSort(arr, start+1)
无
mergeSort(arr, left, right):表示当前要排序的子区间是 arr[left...right]
初始子问题 (原问题)
mergeSort(arr, 0, n-1):表示当前要排序的子区间是 arr[0...n-1]
left >= right:表示当前要排序的子区间是 arr[left...right],它的长度为 1 或者 0,因为单个元素或者空集是有序的,不用继续拆分了。
拆分前:mergeSort(arr, left, right)
操作:取区间的中点 mid = left + (right-left)/2。
拆分后:mergeSort(arr, left, mid) 和 mergeSort(arr, mid+1, right)
合并,即两个有序的子区间 arr[left...mid] 和 arr[mid+1...right] 合并成一个整体有序的区间 arr[left...right]。
heapSort(arr, heapSize):
arr[0...heapSize-1]区间划分状态:
arr[0...heapSize-1] 已经是一个合法的堆arr[heapSize..n-1] 已有序,且每个元素都在最终位置上初始子问题 (原问题)
heapSort(arr, n):
arr[0...n-1]区间划分状态:
arr[0...n-1] 已经是一个合法的堆arr[n..n-1] 已有序,且每个元素都在最终位置上heapSize<=1
heapSort(arr, 1):
arr[0...0]区间划分状态:
arr[0...0] 已经是一个合法的堆arr[1..n-1] 已有序,且每个元素都在最终位置上拆分前:heapSort(arr, heapSize)
目标:将当前堆区间的最大值放在其最终位置 heapSize-1 上
操作:
arr[0, heapSize-1] 的最大值跟 arr[heapSize-1] 交换heapSize--;arr[0,heapSize-1] 执行下沉操作,以恢复堆性质拆分后:heapSort(arr, heapSize-1)
无
quickSort(arr, left, right):表示当前要排序的子区间是 arr[left...right]
初始子问题 (原问题)
quickSort(arr, 0, n-1):表示当前要排序的子区间是 arr[0...n-1]
left >= right:表示当前要排序的子区间是 arr[left...right],它的长度为 1 或者 0,因为单个元素或者空集是有序的,不用继续拆分了。
拆分前:quickSort(arr, left, right)
目标:先让区间中的一个元素 (基准元素) 归位到其最终有序位置,后再拆分
操作:
arr[right] 为基准元素 pivot。pivotIndex。pivot 的元素都在其左侧,所有大于 pivot 的元素都在其右侧。拆分后:quickSort(arr, left, pivotIndex-1) 和 quickSort(arr, pivotIndex+1, right)
无

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online