数据结构与算法-排序

一.插入排序

1.直接插入排序(顺序法)

(1)复制要插入的元素  temp=arry[ i ];   

(2)记录后移,查找插入的位置    j = i - 1   arry[ j ]为插入元素的前一个元素

判断arry[ j ]  > temp 而且 j >= 0,则arry[ j ] 需要往后移    a[ j+1 ]=a[ j ]    注意:j >= 0

(3)插入正确的位子    a[ j +1 ] = temp

代码:

2.直接插入排序(哨兵法)

(1)复制哨兵  arry[ 0 ]=arry[ i ];   

(2)记录后移,查找插入的位置    j = i - 1   arry[ j ]为插入元素的前一个元素

判断arry[ 0 ] < arry[ j ],无需判断j >= 0,满足则arry[ j ] 需要往后移    a[ j+1 ]=a[ j ]   

(3)插入正确的位子    a[ j +1 ] = arry[ 0 ]

代码:注意:i=2开始,此处不影响结果

3.折半插入排序

在哨兵法的基础上修改

(1)复制哨兵

(2)查找插入位置下标   low = 1,high = i-1(前面有序元素的长度)

判断arry[ 0 ] 与 arry[ mid ]的大小,若arry[ 0 ] < arry[ mid ],high = mid -1;若arry[ 0 ] > arry[ mid ],low = mid+1。 缩短查询长度,确认插入位置下标

(3)元素后移  确认插入位置下标后,不能直接插入,需要后移元素

将下标为high+1以后的元素(包括high+1)往后移动

for(j=i-1;j>=high+1;j--)

arry[j+1]=arry[j]; 

(4)插入元素   arry[ high+1 ]=arry[ 0 ]

代码:

4.希尔排序

判断分级组,分组数量一般为素数(1,3,5,7....),若分为间隔5,则中间间隔4个数,以此类推

代码:

理论上与哨兵法相同,只是在外面嵌套for循环,确定步长,仔细看发现,当dk=1时,为哨兵法

二.交换排序

1.冒泡排序

思路:两两比较,按照"从小到大"排序

代码:

2.快速排序(双向)

思路:任取一个数(一般为第一个元素)为中心

所有比它小的数一律放前面,比它大的数一律放后面,形成左右两个子表   小小小目标数大大大

对各个子表重新选择中心元素,按照上面规则继续调整,直到每个子表元素只剩一个 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值