一.插入排序
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.快速排序(双向)
思路:任取一个数(一般为第一个元素)为中心
所有比它小的数一律放前面,比它大的数一律放后面,形成左右两个子表 小小小目标数大大大
对各个子表重新选择中心元素,按照上面规则继续调整,直到每个子表元素只剩一个