目录
一.选择排序
时间复杂度为Θ(n²)
算法
输入:n个元素的数组A[1…n]
输出:按非降序排列的数组A[1…n]for i←1 to n-1
k←i //设立标志位
for j←i+1 to n //查找第i小的元素
if A[j]
end for
if k≠i then 交换A[i]与A[k]
end for
操作方法:首先找到最小元素,将其存放在A[1]中,然后找到剩下的n-1个元素中的最小元素,将其存放在A[2]中,重复此过程直至找到第二大的元素,并将其存放在A[n-1]中
二.插入排序
算法
输入:n个元素的数组A[1…n]
输出:按非降序排列的数组A[1…n]for i←2 to n
x←A[i]
j←i-1
while(j>0) and (A[j]>x)
A[j+1]←A[j]
j←j-1
end while
A[j+1]←x
end for
操作方法:在第i次插入中,要将A[i]插入到已排序的子数组A[1…n-1]中的合适位置上,依次扫描序号从i-1到1的元素,每次都将A[i]和当前位置的元素比较,在扫描的每一步,元素A[1…i-1]大于A[i]都被移到序号更高的一个位置上,然后在合适的位置上插入A[i]
三.快速排序(分治法)
时间复杂度为Θ(n*logn)空间复杂度为Θ(n)
输入:数组A[]low…high]
输出:(1)如有必要,输出按上述描述的重新排列的数组A
(2)划分元素A[low]的新位置w
split算法i←low
x←A[low] //第一位的元素
for j←low+1 to high //遍历数组中剩下所有元素
if A[j]≤x then
i←i+1 //用i指针来从第二个元素开始交换添加较小的元素
if i≠j then 互换A[i]和A[j]
end if
end for
互换A[low]和A[i]
w←i
return A和w
操作方法:用i指针和j指针交换元素,当算法对所有元素扫描后,用A[i]与主元交换,这样所有小于或等于主元的元素处于它的左边,并且所有大于主元的元素处于它的右边,最后算法将i赋给主元的位置w
quicksort算法
输入:n个元素的数组A[1…n]
输出:按非降序排列的数组A[1…n]
quicksort(A,low,high)if low
SPLIT(A[low…high],w) //w为A[low]的新位置
quicksort(A,low,w-1)
quicksort(A,w+1,high)
end if
操作方法:子数组A[low…w-1]和A[w+1,high)递归地排序
四.归并排序(分治法)
时间复杂度为Θ(n*logn)空间复杂度为Θ(n)
算法
输入:n个元素的数组A[1…n]
输出:按非降序排列的数组A[1…n]
mergesort(A,1,n)
过程:mergesort(low,high)if low
mid←⌊(low+high)/2⌋
mergesort(A,low,mid)
mergesort(A,mid+1,high)
MERGE(A,low,mid,high)
end if
合并两个有序的表
输入:数组A[1…m]和它的三个索引p,q,r,1≤p≤q≤r≤m,两个子数组A[p…q]和A[q+1…r]各自按升序排列
输出:合并两个子数组A[p…q]和A[q+1…r]的数组A[p…r]
MERGE//B[p…r]是个辅助数组
s←p;t←q+1;k←p
while s≤q and t≤r
if A[s]≤A[t] then
B[k]←A[s]
s←s+1
else
B[k]←A[t]
t←t+1
end if
k←k+1
end while
if s=q+1 then B[k…r]←A[t…r]
else B[k…r]←A[s…q]
end if
A[p…r]←B[p…r]