【大话数据结构&算法】希尔排序(Java/C实现源码)
来源:互联网 发布:矩阵和伴随矩阵的秩 编辑:程序博客网 时间:2024/05/20 18:41
希尔排序的实质就是分组插入排序,该方法又称为缩小增量排序。
直接插入排序适合于序列基本有序的情况,希尔排序的每趟排序都会使整个序列变得更加有序,等整个序列基本有序了,再来一趟直接插入排序,这样会使排序效率更高,这就是希尔排序的思想。
基本思想总结如下:
先将整个待排元素序列分割 成若干个子序列(由相隔某个“增量” 的元素组成)分别进行直接插入排序, 然后依次缩减增量再进行排序,待整个 序列中的元素基本有序(增量足够小) 时,再对全体元素进行一次直接插入排序。
希尔排序基本算法实现如下:
void shellSort(int[] a, int n){ int i,j,gap; //步长 for (gap = n/2;gap > 0;gap /= 2) { //直接插入排序 for(i = 0;i < gap;i++){ for(j = i + gap;j < n; j += gap){ //对一个小序列中的元素进行比较排序 if(a[j] < a[j - gap]){ int temp = a[j]; int k = j - gap; while(k >= 0 && a[k] > temp){ a[k + gap] = a[k]; k -= gap; } a[k + gap] = temp; } } } }}
java代码实现如下:
public class ShellSort { public static void main(String[] args) { int[] a = {9,4,2,1,5,0,6,7}; shellSort1(a, 8); for (int i = 0; i < a.length; i++) { System. out.println(a[i]); } System. out.println("***********" ); shellSort2(a, 8); for (int i = 0; i < a.length; i++) { System. out.println(a[i]); } System. out.println("***********" ); shellSort3(a, 8); for (int i = 0; i < a.length; i++) { System. out.println(a[i]); } } //严格按定义实现的希尔排序 public static void shellSort1(int[] a, int n){ int i,j,gap; //步长 for (gap = n/2;gap > 0;gap /= 2) { //直接插入排序 for(i = 0;i < gap;i++){ for(j = i + gap;j < n; j += gap){ //对一个小序列中的元素进行比较排序 if(a[j] < a[j - gap]){ int temp = a[j]; int k = j - gap; while(k >= 0 && a[k] > temp){ a[k + gap] = a[k]; k -= gap; } a[k + gap] = temp; } } } } } /** * 优化:以第二次排序为例,原来是每次从1A到1E,从2A到2E,可以改成从1B开始,先和1A比较, * 然后取2B与2A比较,再取1C与前面自己组内的数据比较…….。这种每次从数组第gap个元素开始, * 每个元素与自己组内的数据进行直接插入排序显然也是正确的。 * * @param a * @param n */ public static void shellSort2(int[] a, int n){ int j,gap; //步长 for(gap = n / 2;gap > 0;gap /= 2){ //数组从第gap个元素开始 for(j = gap;j < n; j++){ //每个元素与自己组内的元素进行直接插入排序 if(a[j] < a[j - gap]){ int temp = a[j]; //交换a[j]和a[j-gap]的位置 while(j - gap >= 0 && a[j - gap] > temp){ a[j] = a[j - gap]; } a[j - gap] = temp; } } } } /** * 优化:将以上优化算法的直接插入排序部分用直接插入排序算法替代 * * @param a * @param n */ public static void shellSort3(int[] a, int n){ int i,j,gap; //步长 for(gap = n / 2;gap > 0;gap /= 2){ //数组从第gap个元素开始 for(i = gap;i < n;i++){ //交换a[i-gap]和a[i]的位置 for(j = i - gap;j >= 0 && a[j] > a[j + gap];j -= gap){ int temp = a[j]; a[ j] = a[j + gap]; a[j + gap] = temp; } } } }}
C实现如下:
时间复杂度:
希尔排序的平均时间复杂度为O(nlogn){以2为底}。
空间复杂度:
希尔排序的空间复杂度同直接插入排序一样为O(1)。
注意:希尔排序的增量取法需要注意的一点就是,首先增量序列的最后一个值一定是1;其次增量序列中的值没有除1之外的公因子,如8,4,2,1这样的序列就不要取,因为8,4,2有公因子2。
0 0
- 【大话数据结构&算法】希尔排序(Java/C实现源码)
- 【大话数据结构&算法】冒泡排序(Java/C实现源码)
- 【大话数据结构&算法】归并排序(Java/C实现源码)
- 数据结构算法之排序系列Java、C源码实现(2)--希尔排序
- 【大话数据结构&算法】快速排序算法(Java/C实现源码)
- 【大话数据结构&算法】直接插入排序(Java/C实现源码)
- 【大话数据结构&算法】直接选择排序(Java/C实现源码)
- 希尔排序实现(ShellSort) Java数据结构与算法
- 数据结构与算法——希尔排序(Java实现)
- 数据结构与算法(9)---Java语言实现:希尔排序
- 排序算法(C实现)------- 希尔排序
- 希尔排序算法实现(C++)
- 希尔排序算法实现(C++)
- 算法实现之希尔排序(C++)
- 数据结构算法之排序系列Java、C源码实现(1)--直接插入排序
- 数据结构算法之排序系列Java、C源码实现(3)--直接选择排序
- 数据结构算法之排序系列Java、C源码实现(4)--堆排序
- 数据结构算法之排序系列Java、C源码实现(5)--冒泡排序
- 计算几何初步
- React Native开发安装和创建工程
- Java 8: 从永久代(PermGen)到元空间(Metaspace)
- oracle常用函数
- FB 硬件抽象层gralloc原理流程分析
- 【大话数据结构&算法】希尔排序(Java/C实现源码)
- HDU 3665 Seaside
- 二叉树中两个节点的最近公共祖先节点
- hdu5793 A Boring Question(推公式or迷之找规律)
- PhpStorm无法使用Terminal解决方法
- Maven那点事儿(Eclipse版)
- ue4 中动画控制,利用conduit节点
- JAVA学习笔记----接口、抽象类、内部类
- 【CDP-云设计模式】第6章,3.直接对象上传模式(Direct Object Upload Pattern)