Shell排序(希尔)算法--java

先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<;…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。

该方法实质上是一种分组插入方法。

原理图:

源代码

 1 package com.zc.manythread;
 2 /**
 3  *
 4  * @author 偶my耶
 5  *
 6  */
 7 public class ShellSort {
 8     public static int count = 0;
 9
10     public static void shellSort(int[] data) {
11         // 计算出最大的h值
12         int h = 1;
13         while (h <= data.length / 3) {
14             h = h * 3 + 1;
15         }
16         while (h > 0) {
17             for (int i = h; i < data.length; i += h) {
18                 if (data[i] < data[i - h]) {
19                     int tmp = data[i];
20                     int j = i - h;
21                     while (j >= 0 && data[j] > tmp) {
22                         data[j + h] = data[j];
23                         j -= h;
24                     }
25                     data[j + h] = tmp;
26                     print(data);
27                 }
28             }
29             // 计算出下一个h值
30             h = (h - 1) / 3;
31         }
32     }
33
34     public static void print(int[] data) {
35         for (int i = 0; i < data.length; i++) {
36             System.out.print(data[i] + "\t");
37         }
38         System.out.println();
39     }
40     public static void main(String[] args) {
41
42         int[] data = new int[] { 4, 3, 6, 2, 1, 9, 5, 8, 7 };
43         print(data);
44         shellSort(data);
45         print(data);
46
47     }
48 }

运行结果:

Shell排序是不稳定的,它的空间开销也是O(1),时间开销估计在O(N3/2)~O(N7/6)之间

时间: 2024-08-29 07:33:24

Shell排序(希尔)算法--java的相关文章

常见排序&amp;查询算法Java代码实现

1. 排序算法代码实现 /** * ascending sort * 外层循环边界条件:总共需要冒泡的轮数--每一轮都将最大或最小的数冒泡到最后 * 内层循环边界条件:冒泡数字移动的边界--最终数字需冒泡到此处 * 时间复杂度:O(n^2) * @param arr */ public static void bubbleSort(int[] arr) { if (arr == null) { throw new RuntimeException("Input arr is null!"

Java排序算法(四):Shell排序

[基本的想法] 将原本有大量记录数的记录进行分组.切割成若干个子序列,此时每一个子序列待排序的记录个数就比較少了,然后在这些子序列内分别进行直接插入排序,当整个序列都基本有序时.再对全体记录进行一次直接插入排序. 所谓的基本有序,就是小的keyword基本在前面,大的基本在后面,不大不小的基本在中间.像{2, 1, 3, 6, 4, 7, 5, 8, 9}这样能够称为基本有序了. [java实现] public class ShellSort { public static void main(

Java常见排序算法之Shell排序

在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let‘s go~~~ 1.排序算法的基本概念的讲解 时间复杂度:需要排序的的关键字的比较次数和相应的移动的次数. 空间复杂度:分析需要多少辅助的内存. 稳定性:如果记录两个关键字的A和B它们的值相等,经过排序后它们相对的位置没有发生交换,那么我们称这个排序算法是稳定的. 否则我们称这个排序算法是不稳定的

数据结构与算法——希尔排序(shell排序)

//希尔排序(shell排序)#include<iostream>using namespace std;void print(int a[], int n ,int i){ cout<<i <<":"; for(int j= 0; j<n; j++) { cout<<a[j] <<" "; } cout<<endl; } /* 直接插入排序的一般形式 * * d 缩小增量,如果是直接插入

必须知道的八大种排序算法【java实现】(二) 选择排序,插入排序,希尔算法【详解】

一.选择排序 1.基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换:然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止. 2.实例 3.算法实现 /** * 选择排序算法 * 在未排序序列中找到最小元素,存放到排序序列的起始位置 * 再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾. * 以此类推,直到所有元素均排序完毕. * @param numbers */ public static void selectSort(in

排序算法Java版,以及各自的复杂度,以及由堆排序产生的top K问题

常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结束.时间复杂度:O(n^2) 选择排序:每次在无序队列中"选择"出最大值,放到有序队列的最后,并从无序队列中去除该值(具体实现略有区别).时间复杂度:O(n^2) 直接插入排序:始终定义第一个元素为有序的,将元素逐个插入到有序排列之中,其特点是要不断的 移动数据,空出一个适当的位置,把待插

排序算法3--插入排序--希尔排序(缩小增量排序)

希尔排序(缩小增量排序) 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序.因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高. 以n=10的一个数组4

经典排序算法(Java实现)

以下程序均将数据封装于DataWrap数据包装类中,如下所示: 1 //数据包装类 2 class DataWrap implements Comparable<DataWrap> 3 { 4 int data; 5 String flag; 6 public DataWrap(int data,String flag) 7 { 8 this.data = data; 9 this.flag = flag; 10 } 11 //重写compareTo方法 12 public int compa

Java数据结构 遍历 排序 查找 算法实现

1. 遍历算法(遍历二叉树6种方法) 1.1. 概述 遍历算法针对二叉树而言的,主要有先序.中序.后序三种遍历顺序,三种顺序又分别有递归和常规算法,二叉树遍历的主要思想是:遍历左子树,遍历右子树,访问根节点,由这三者的遍历顺序来确定是先序.中序还是后序.下面只要求掌握递归遍历算法,常规遍历算法见附录一. 1.2. 先序遍历算法 遍历顺序:访问根节点,遍历左子树,遍历右子树.代码如下: void preOrder(BinaryTreeNode bt) { if (bt == null)// 如果当