数据结构之排序算法

1 直接插入排序
将一个记录插入到已经排好序的有序表中,只有当排序结束时每个元素才能进入到正确的位置,复杂度为O(n2)。
优点:算法简单、易行,当待排序记录数量较少时,该算法非常有效;
缺点:数据规模较大时,效率比较低。

算法InsertSort(R,n)
//直接插入排序算法,本算法排序n个记录,使得它们相应的关键词排列成一个非递减的序列
InsertSort1.[插入排序]
For j=2 To n DO
(
i = j - 1;//每次循环将Rj插入到R1,...,Rj-1之中
K = Kj;
R = Rj;
WHILE i>0 AND K<Ki DO
(
Ri+1 = Ri;//移动
i = i-1;
)
Ri+1 = R;//找到元素插入位置
)

2 冒泡排序
不断比较交换相邻序列中的反序对,直到不再有反序对为止,进行一趟比较,至少把具有最大关键词的记录送到最上边,复杂度为O(n2)。冒泡排序是一种稳定的排序算法。

算法Bubble(R,n)
Bubble1.[终止位置初始化]
BOUND = n;
Bubble2.[冒泡过程]
WHILE BOUND!=0 DO
(
t = 0;//t用来记录一趟冒泡最后记录交换的位置
FOR j=1 TO BOUND-1 DO
(
IF Kj>Kj-1 THEN
(
Rj <-> Rj+1;//交换两个元素
t = j;
)
)
BOUND = t;
)

3 直接选择排序
通过直接找到最小记录未知,直接交换到正确位置,对待排序文件(R1,R2,…,Rn)进行n-1次选择操作,其中第i次操作是选择第i小(或大)的记录放在第i个(或n-i+1)位置上。复杂度O(n2)。选择排序是一种不稳定的排序算法,如序列5,8,5,2,9,第一遍选择第一个元素5和最小元素2进行交换,交换后原序列中两个5的次序发生了变化,因此选择排序是不稳定排序。

算法SSort(R,n)
//直接选择排序算法,该算法排序文件(R1,R2,...,Rn),将第i大元素放在第n-i+1个位置上
SSort1.[排序]
FOR j=n TO 2 STEP-1 DO
(
t = 1;
FOR i=2 TO j DO
(
IF Kt < Ki THEN t=i;//每次选出最大元素
)
Rj <-> Rt;//两个元素交换
)

4 Shell排序
把记录按下标的一定增量分组,对每组使用直接插入排序法,随着增量逐渐减少,每组包含的记录越来越多,当增量值减至1时,整个文件恰好被分成一个组,算法便终止。Shell排序是不稳定排序。
如,输入文件在增量值取8时共分成8个组:
R1, R9; R2, R10; R3, R11; ……; R8, R16;
缺点:目前为止还不知道如何去选择能够产生最好结果的渐减序列。

5 直接插入、冒泡和直接选择三种简单排序算法比较
三种简单排序算法在最坏情况下都需要O(n2)时间,都是通过两次循环实现。插入排序是依次对前i个记录进行排序,冒泡和选择排序则是依次从剩余记录中找到第i小记录,但冒泡排序通过不断比较交换相邻记录实现,直接选择排序通过直接找到最小记录位置,直接交换到正确位置。因此,直接选择排序可以看作是对冒泡排序的改进,优于冒泡排序。

6 快速排序
不断交换反序对,把控制分划过程的关键词Kj直接放在它排序的最终位置上,原来的文件就分划成两个子文件,Kj前的元素都比其小,Kj后的元素都比其大。复杂度为O(nlog2n)。快速排序是一种不稳定排序,在关键元素Rm与Rj交换时,很可能将前面元素的稳定性打乱,如序列5,3,3,4,3,8,9,11,现在关键元素5和第五个元素3交换,会打乱稳定性。
快速排序的第一次分划过程

算法QSort(R,m,n)
//快速排序的递归算法,该算法对文件(Rm,...,Rn)进行排序,选择Km作为控制分划的关键词
QSort1[递归出口]
IF m<n THEN
{
i = m;
j = n+1;//第n+1个元素为假定的元素,其值大于文件中的任意值
K = Km;//控制分划的关键词
WHILE i<j DO
{
i = i+1;
WHILE Ki<K DO i = i+1;//找到元素交换的位置
WHILE Kj>K DO j = j-1;
IF i<j THEN Ri <-> Rj;//交换两个元素
} 
Rm <-> Rj;//找到关键词的位置
QSort(R,m,j-1);//将原文件分成了两部分
QSort(R,j+1,n);
}

7 堆排序
不稳定排序,复杂度为O(nlog2n)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值