文中大部分内容为摘抄自网友文章,仅供个人学习和备忘。
希尔排序(Shell's Sort)是插入排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名。
算法思想
先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。
算法步骤
- 选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;
- 按增量序列个数k,对序列进行k 趟排序;
- 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。
算法稳定性
由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的。
算法描述(JAVA)
public void sheelSort(int arr[]){
int dk = arr.length/2;
while( dk >= 1 ){
shellSort(arr, dk);
dk = dk/2;
}
}
private void shellSort(int arr[],int k){
for(int i = k;i<arr.length;i++){
if(arr[i] < arr[i - k]){
int j = i - k;
int temp = arr[i];
while(j > -1 && temp < arr[j]){
arr[j + k] = arr[j];
j -= k;
}
arr[j + k] = temp;
}
}
}