ZJ-013期算法:希尔排序
Posted 程序媛日常吖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZJ-013期算法:希尔排序相关的知识,希望对你有一定的参考价值。
前言:
往期回顾:
【ZJ-001期】数据结构(一):数组
【ZJ-002期】数据结构(二):队列
【ZJ-003期】数据结构(三):栈
【ZJ-004期】数据结构(四):单链表
【ZJ-005期】数据结构(五):双链表
【ZJ-006期】数据结构(六):二叉树
【ZJ-007期】数据结构(七):二叉搜索树
【ZJ-008期】数据结构(八):二叉搜索树删除
【ZJ-009期】算法(一):贪心算法
【ZJ-010期】算法(二):冒泡排序
【ZJ-011期】算法(三):选择排序
【ZJ-012期】算法(四):插入排序
今日内容:
大家好哈~~~接下来的几天是排序算法,大家可以随我看我一下噢。
什么是希尔排序?
希尔排序是希尔(Donald Shell) 于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。
基本思想:希尔排序是把记录按下表的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
希尔排序的算法步骤是什么?
选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;
按增量序列个数k,对序列进行k 趟排序;
每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。
如何实现希尔排序?
public class Solution {
public static void main(String[] args) {
int[] array = new int[]{1,3,5,2,4,6,8};
int len = array.length;
int temp, gap = len / 2;
while (gap > 0) {
for (int i = gap; i < len; i++) {
temp = array[i];
int preIndex = i - gap;
while (preIndex >= 0 && array[preIndex] > temp) {
array[preIndex + gap] = array[preIndex];
preIndex -= gap;
}
array[preIndex + gap] = temp;
}
gap /= 2;
}
System.out.println("排列后的结果是:");
for(i = 0; i < arr.length; i++) {
System.out.print(arr[i]+",");
}
}
}
希尔排序的稳定性如何?
希尔排序中相等数据可能会交换位置,所以希尔排序是不稳定的算法。
希尔排序复杂度如何?
时间复杂度:O(nlog2n)
最佳情况:T(n) = O(nlog2 n)
最坏情况:T(n) = O(nlog2 n)
平均情况:T(n) = O(nlog2n)
空间复杂度:O(1),只需要一个附加程序单元用于交换
好了,今天就到这里,感谢各位看官到这里~
以上是关于ZJ-013期算法:希尔排序的主要内容,如果未能解决你的问题,请参考以下文章