几种常用的排序算法
本文讨论两种著名且很有用的排序算法:插入排序,快速排序。
插入排序
插入排序的思想与打牌起牌类似:每次从牌堆里拿一张牌,插入到已经排好序的牌中。
具体算法描述如下:
从第一个元素开始,该元素可以认为已经被排序
取出下一个元素,从该元素开始,从后向前扫描表
如果前一个元素大于后一个元素,则交换两个元素的位置
重复步骤 3,直到前一个元素不大于后一个元素
重复步骤 2~4
现有一组数组 A = [5, 6, 3, 1, 8, 7, 2, 4],共有八个记录,排序过程如下:
[5] 6 3 1 8 7 2 4 ↑ │ └───┘[5, 6] 3 1 8 7 2 4↑ │└────────┘[3, 5, 6] 1 8 7 2 4↑ │└──────────┘[1, 3, 5, 6] 8 7 2 4 ↑ │ └──┘[1, 3, 5, 6, 8] 7 2 4 ↑ │ └────┘[1, 3, 5, 6, 7, 8] 2 4 ↑ │ └────────────────┘[1, 2, 3, 5, 6, 7, 8] 4 ↑ │ └─────────────┘[1, 2, 3, 4, 5, 6, 7, 8]
动态过程如下:
代码实现:
function isort(A, n, i, j, t) {
for (i = 2; i 1 && A[j-1] > A[j]; j--) {
swap 2 elements
t = A[j-1] A[j-1] = A[j] A[j] = t }}
}
测试代码
每个数字占一行
{ A[NR] = $0 }
END {
isort(A, NR)
for (i = 1; i
要排序的文件:
$ cat isort.txt
5
6
3
1
8
7
2
4
排序后输出:
$ awk -f isort.awk isort.txt
1
2
3
4
5
6
7
8
输入倒序的10个数字:
$ seq 1 10 | tac | awk -f isort.awk
1
2
3
4
5
6
7
8
9
10
算法复杂度分析:
因为有两层循环,所以算法复杂度为
$$ O(n^2)$$
快速排序
快速排序是图灵奖得主 C. R. A. Hoare 于1960 年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide and Conquer)。
分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。
步骤为:
从数列中挑出一个元素,称为"基准"(pivot),
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
图解可以看这里,讲得比较详细。
代码实现:
function swap(A, left, right, t) {
t = A[left]
A[left] = A[right]
A[right] = t
}
function qsort(A, left, right, pivot, i, j) {
if (left A[pivot] && j >= left)
j--
if i = j it means the j-th position is the correct position
# of the pivot element, hence swap the pivot element with the # element in the j-th position swap(A, pivot, j) # Repeat quicksort for the two sub-arrays, one to the left of j # and one to the right of j qsort(A, left, j - 1) qsort(A, j + 1, right)}
}
测试代码
{ A[NR] = $0 }
END {
qsort(A, 1, NR)
for (i = 1; i
和插入排序一样,测试如下:
$ cat isort.txt
5
6
3
1
8
7
2
4
$ awk -f qsort.awk isort.txt
1
2
3
4
5
6
7
8
$ seq 1 10 | tac | awk -f qsort.awk
1
2
3
4
5
6
7
8
9
10
算法复杂度分析:
平均复杂度为 $$ O(nlogn) $$
关键字:算法, 排序
版权声明
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!