目录
一.选择排序
时间复杂度为Θ(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]<A[k] then k←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<high then
- 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<high then
- 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]
末尾挂一波我看到的极好讲算法导论的文章https://blog.csdn.net/summer070825/article/details/52627229