选择排序
伪算法:
function SelectionSort(A, n)
for i = n-1 downto 1
max_index = 0 //选取一位标志位为最大元素下标
for j = 1 to i
if A[j] > A[max_index]
//如果j所指向的数字大于标志位的数字时,将max_index指向j
max_index = j
SWAP(A[j], A[max_index]) //交换j和max_index的数值
冒泡排序
伪算法:
function BubbleSort(A, n)
for i=n-1 downto 1
#将A[0,...,i]从左向右冒泡,最大的数将出现在最右边
for j=0 to i-1
if A[j] > A[j+1]
SWAP(A[j], A[j+1])
优化:
function BubbleSort(A, n)
for i=n-1 downto 1
Swapped = Flase
#将A[0...i]从左向右冒泡,最大的数将出现在最右边
for j=0 to i-1
if A[j] > A[j+1]
//如果前一位数字大于后一位数字,则交换数值
SWAP(A[j], A[j+1])
Swapped = True
if not Swapped
break
插入排序
类似于抓扑克牌
伪算法:
function InsertSort(A, n)
for i=1 to n-1
#将A[i]插入到已排好序的A[0,...,i-1]中
new_card = A[i]
j = i-1
while j>=0 and A[j] > new_card
//当j所指向的手牌比要插入的新牌大时,需要向右移动这张手牌,并将指针j左移一位
A[j+1] = A[j]
j = j-1
A[j+1] = new_card //当new_card大于j所指向的数字时,将new_card插入到j+1的位置
最好时间复杂度 | 最坏时间复杂度 | 平均时间复杂度 | |
---|---|---|---|
选择排序 | O(n²) | O(n²) | O(n²) |
冒泡排序 | O(n) | O(n²) | O(n²) |
插入排序 | O(n) | O(n²) | O(n²) |
- 一般情况下,时间复杂度,选择最慢,冒泡次之,插入相比较快
- 在数据规模小的情况下,选择插入排序
归并排序
- 算法核心思想:分治法,将原问题分成子问题,分别解决,合成答案
1、将序列中待排序数字分为若干组,每个数字为一组
2、将若干个组两两合并,保证合并后的组是有序的
3、重复第二步操作知道只剩下一组,排序完成 - 时间复杂度:O(n*logn)
- 空间复杂度:O(n)
- 应用:合并有序链表,链表的元素访问方式是顺序访问
快速排序
- 基本思想:
1、选定 pivot 中心轴(一般选取最左边的数字)
2、将大于 pivot 的数字放在 pivot 的右边
3、将小于 pivot 的数字放在 pivot 的左边
4、分别对左右子序列重复前 3 步操作 - 最坏时间复杂度:O(n²)
- 平均时间复杂度:O(nlogn)
- 最好时间复杂度:O(nlogn)