1
0
mirror of https://github.com/Didnelpsun/CS408.git synced 2026-06-18 01:19:14 +08:00

更新排序

This commit is contained in:
Didnelpsun
2021-09-30 23:39:01 +08:00
parent 7b91890693
commit ae1d32460e
16 changed files with 322 additions and 235 deletions

View File

@@ -41,9 +41,11 @@
也称为折半插入排序,是对直接插入排序的优化,在寻找插入位置时使用二分查找的方式。
当data[mid]==data[i]时为了保证算法的稳定性会继续在mid所指位置右边寻找插入位置。
$data[mid]==data[i]$时,为了保证算法的稳定性,会继续在$mid$所指位置右边寻找插入位置。
当low>high时停止折半查找并将[low,i-1]内的元素全部右移并把元素值赋值到low所指的位置。
$low>high$时停止折半查找,并将$[low,i-1]$内的元素全部右移,并把元素值赋值到$low$所指的位置。
折半插入排序是找到位置了后一起移动元素,而直接插入排序是边查找边排序。
#### 二分插入排序的性能
@@ -51,15 +53,17 @@
二分插入排序是稳定的。
比起直接插入排序,比较关键字的次数减少,移动元素的次数没变,所以总体时间复杂度为$O(n^2)$。
比起直接插入排序,比较关键字的次数减少为$O(n\log_2n)$,移动元素的次数没变,所以总体时间复杂度为$O(n^2)$。
### 希尔排序
又称缩小增量排序。
#### 希尔排序的过程
希尔排序也是对直接插入排序的优化。直接插入排序对于基本有序的序列排序效果较好,所以就希望序列能尽可能基本有序。从而希尔排序的思想就是先追求表中元素部分有序,然后逐渐逼近全局有序。
先将整个待排序元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的),分别进行直接插入排序,然后缩小增量重复上述过程,直到增量为1
先将整个待排序元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的),分别进行直接插入排序(或者折半插入排序),然后缩小增量重复上述过程,直到增量为$1$。每次对比只对比两个元素进行插入交换
增量序列的选择建议是第一趟选择元素个数的一半,后面不断缩小到原来的一半。