从排序开始学JAVA(2)——希尔排序

希尔排序(Shell Sort)是插入排序的一种。是针对直接插入排序算法的改进。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。

基本思想:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。当增量减到1时,进行直接插入排序后,排序完成。

代码实现:

 1 package sort;
 2
 3 public class ShellSort {
 4     public static void main(String[]args){
 5         int[]array={49,38,65,97,76,13,27,49,55,4};
 6         double length=array.length;
 7
 8         int temp=0;
 9         while(true){                                //用d来判断最外层循环次数
10            length=Math.ceil(length/2);
11            int d=(int) (length);
12                 for(int x=0; x<d;x++){
13                     for(int i=x+d;i<array.length;i+=d){
14                         temp=array[i];
15                         int j=i-d;
16                         for(;j>=0&&temp<array[j];j-=d)      //插入排序
17                             array[j+d]=array[j];
18                         array[j+d]=temp;
19
20                     }
21
22                 }
23
24             if(d==1) break;
25
26     }
27         for(int i=0;i<array.length;i++)
28             System.out.print(array[i]+" ");
29     }
30
31
32 }
时间: 2025-01-07 03:01:51

从排序开始学JAVA(2)——希尔排序的相关文章

Java实现希尔排序(增量递减排序)

1 package Insert.sort; 2 3 import java.util.Scanner; 4 5 /*又叫缩小增量排序,本质是插入排序,将待排的序列增量分成几个子序列,分别对每个子序列进行直接插入排序 6 * 增量为5时,取1.6.11.16...为一组,2.7.12.17...为一组等,分别对这些组进行直接插入排序,就是一趟希尔排序 7 * 再以增量为3分割,构成组,分别对这些组进行直接插入排序,就是第二趟希尔排序 8 * 增量为1分割,就是将整个序列进行一趟直接插入排序...

从排序开始学JAVA(1)

直接插入排序 基本思想:有一列数,把待排数字插入到前面已排好的数字序列中. 比如 n个数做直接插入排序                                                            56,14,45,69,42,8,10 开始时有序表中只包含一个元素,无序组中有n-1个元素                  有序表                       无序表 56                     14,45,69,42,8,10 从无序表取

排序算法(六)——希尔排序

基本思想 希尔排序是基于插入排序的,又叫缩小增量排序. 在插入排序中,标记符左边的元素是有序的,右边的是没有排过序的,这个算法取出标记符所指向的数据,存入一个临时变量,接着,在左边有序的数组中找到临时变量应该插入的位置,然后将插入位置之后的元素依次后移一位,最后插入临时变量中的数据. 试想,假如有一个很小的数据项在靠近右端的位置上,把这个数据项插入到有序数组中时,将会有大量的中间数据项需要右移一位,这个步骤对每一个数据项都执行了将近N次复制.虽然不是所有数据项都必须移动N个位置,但是,数据项平均

C# 插入排序 冒泡排序 选择排序 快速排序 堆排序 归并排序 基数排序 希尔排序

下面列出了数据结构与算法的八种基本排序:插入排序 冒泡排序 选择排序 快速排序 堆排序 归并排序 基数排序 希尔排序,然后是测试的例子.代码位置:http://download.csdn.net/detail/luozuolincool/8040027 排序类: public class Sortings { //插入排序 public void insertSort(int[] array) { int temp = 0; int index = 0; for (int i = 0; i <

【数据结构与算法】内部排序之一:插入排序和希尔排序的N中实现(不断优化,附完整源码)

转载请注明出处:http://blog.csdn.net/ns_code/article/details/20043459   前言 本来想将所有的内部排序总结为一篇博文,但是随着研究的深入,还是放弃了这个念头,斟前酌后,还是觉得分开来写比较好,具体原因,看完本篇博文也就自然明了了. 本篇文章主要探讨插入排序和希尔排序,之所将二者放在一起,很明显,是因为希尔排序是建立在插入排序的基础之上的.     注:以下各排序算法的N种实现方法大部分都是我根据算法思想,自己写出来的,或者是参考其本身的经典实

Java算法-希尔排序

希尔排序的诞生是由于插入排序在处理大规模数组的时候会遇到需要移动太多元素的问题.希尔排序的思想是将一个大的数组“分而治之”,划分为若干个小的数组,以 gap 来划分,比如数组 [1, 2, 3, 4, 5, 6, 7, 8] ,如果以 gap = 2 来划分,可以分为 [1, 3, 5, 7] 和 [2, 4, 6, 8] 两个数组(对应的,如 gap = 3 ,则划分的数组为: [1, 4, 7] . [2, 5, 8] . [3, 6] )然后分别对划分出来的数组进行插入排序,待各个子数组排

算法(第四版)学习笔记之java实现希尔排序

希尔排序思想:使数组中任意间隔为h的元素都是有序的.希尔排序是插入排序的优化,先对数组局部进行排序,最后再使用插入排序将部分有序的数组排序. 代码如下: /** * * @author seabear * */ public class ShellSort { public static void sort(Comparable[] a) { int N = a.length; int h = 1; while(h < N/2) { h = 4 * h + 1; } while(h >= 1)

1)③排序算法之插入排序[2]希尔排序

1 #include<iostream> 2 using namespace std; 3 4 int shell_sort(int n,int array[100]){//希尔排序法 5 register int dh,temp,i,j; 6 dh=n/2; 7 while(dh>=1){ 8 for( i=dh;i<n;i++){ 9 temp=array[i]; 10 j=i-dh; 11 while(j>=0&&array[j]>temp){ 1

经典排序算法学习笔记四——希尔排序

一.希尔排序 数据结构 数组 最差时间复杂度 根据步长序列的不同而不同.已知最好的:O(n*log ^{2}n) 最优时间复杂度 O(n) 平均时间复杂度 根据步长序列的不同而不同. 最差空间复杂度 O(n) 1.算法思想: 先取一个正整数d1<n,把所有序号相隔d1的数组元素放一组,组内进行直接插入排序: 然后取d2<d1,重复上述分组和排序操作: 直至di=1,即所有记录放进一个组中排序为止. 我是栗子,栗子,栗子 假设有这样一组数[ 13 14 94 33 82 25 59 94 65