交换排序 | 插入排序 | 选择排序 | 归并排序 | |
---|---|---|---|---|
简单算法 | 冒泡排序 | 直接插入排序 | 选择排序 | |
改进算法 | 快速排序 | 希尔排序 | 堆排序 | 归并排序 |
排序方法 | 平均时间复杂度 | 辅助空间 | 稳定性 |
---|---|---|---|
冒泡排序 | O(n^2) | O(1) | 稳定:两两交换时,关键字相同的元素不会被左右交换 |
选择排序 | O(n^2) | O(1) | 稳定:在选择待排序列表的最小值元素时是从左到右查找的 |
直接插入排序 | O(n^2) | O(1) | 稳定:元素在插入左边的有序列表时,遇到相等值的元素就不会再移动 |
希尔排序 | O(nlogn)~O(n^2) | O(1) | 不稳定:元素跳跃式移动 |
堆排序 | O(nlogn) | O(1) | 不稳定:堆的定义导致的 |
归并排序 | O(nlogn) | O(n+logn) | 稳定:merge时可以优先挑选左子数组的元素 |
快速排序 | O(nlogn) | O(logn) | 不稳定:partition时元素跳跃式交换 |
思路:两两比较相邻元素的关键字,如果反序则交换,直到没有反序的元素为止
伪代码
def BubbleSort():for i = 1:n(循环操作n-1次,不针对哪个元素):for j = n:i(从后往前遍历):if front>back: exchange(front, back) #把已发现的最小元素抓到最前面
逻辑
复杂度分析:O(n^2)
思路:在第i轮迭代中,通过n-i次关键字的比较,从n-i+1个元素中选出关键字最小的元素,并和第i个元素交换
伪代码
def SelectSort():for i = 1:n-1 (循环n-1次,每次第i个元素要给找出的最小值腾出空位):for: find_min(第i个后面的元素中)exchange(i,min) #将剩下未排序的元素中的最小那个排上来
逻辑
复杂度分析:O(n^2)
def InsertionSort():for i = 2:n(循环n-1次): #每轮循环中是第i个元素被执行插入排序for j=i:1 (从后往前遍历已排序的列表):if front>back: exchange(front, back) #将原来的第i个元素插到正确的位置
def shellSort():h = 初始化间隔while h >= 1: #进行多次间隔不断缩小的插入排序,直至间隔为1for:for:if front>back: exchange(front, back) #两层循环,对子列表做插入排序h = 缩小间隔
逻辑
伪代码
def headSort():for 倒序遍历所有非叶节点:heapAdjust() #构建大顶堆for i = n:2 (倒序遍历n-1次):exchange(1,i)heapAdjust(剩下的1~i-1个元素) #将剩下的元素重新排成大顶堆
复杂度分析:O(nlogn)
思路:先递归地将数组分成两半排序,然后将结果归并起来(2路归并排序)
伪代码
def mergeSort(序列, low, high):if 列表长度为1: returnelif 列表长度为2: if >: exchange() returnelsemergeSort(左侧) #左侧子序列往里递归排序mergeSort(右侧) #右侧子序列往里递归排序merge(当前整个列表)
def merge():sorted = 定义一个辅助数组for i = low:high: #对#在左右两侧每次选一个,挑出来放if 左侧元素选完了: 选右侧的elif 右侧元素选完了: 选左侧的elif 左侧可选的元素更小: 选左侧的elif 右侧可选的元素更小: 选右侧的return sorted
逻辑
复杂度分析:
思路:将序列分为独立的两部分,其中一部分所有关键字均比另一部分的关键字小,然后递归地对两部分继续排序
伪代码
def quickSort(序列,low,high):if 序列长度大于1:分隔点=partition()quickSort(左侧)quickSort(右侧)```
def partition(序列,low,high):pivot = 设定枢轴值while 从左向右遍历的low和从右向左遍历的high未交汇:if 序列[low] >pivot && 序列[high] < pivot:exchange()low++high--
逻辑
复杂度分析
归并排序 | 快速排序 | |
---|---|---|
什么时候进行递归 | 递归调用发生在处理整个数组之前 | 递归调用发生在处理整个数组之后 |
切分后子数组的长度 | 数组被等分(或长度差1);两个子数组相邻 | 切分方法取决于数组的内容;两个子数组中间有一个元素隔开不参与后续递归 |
本文发布于:2024-01-29 08:01:38,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170648650113848.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |