Java学习-插入排序2-希尔排序

希尔排序:

1.基本思路:

先取一个小于n的整数d1作为一个增量,把数组中的数分为d1组,i+d1个数分别为一组,对每个组内的数进行直接插入排序.取第二个数d2<d1作为第二个增量,重复第一步的分组和排序,直至d=1,即所有记录放在同一组中进行直接插入排序为止,希尔排序的实质就是分组进行直接插入排序。

//**数据结构书上讲的有关于希尔排序的方法,,作为一种基础排序方法,还是要掌握滴**//

2:实例

解释一下:当一次增量为5时,57和28是一组,68和96是一组,59和33是一组,52和24是一组,72和19是一组;

对一次分组进行直接插入排序,排序后结果如第二行所示。当第二次增量为3时,28,24,96,72是一组,68,19,59是一

组,33,57,52是一组,再进行排序,结果如第三行所示。直至增量为1时,对其再进行排序,结果如图所示。

3:源代码;

package xierpaixu;

public class xierpaixu {

public static void main(String args[]){

int[] array = {23,34,12,45,56,43,67,65,78,76};

System.out.println("排序之前:");

for(int i=0;i<array.length;i++)

System.out.print(array[i]+" ");

int d=array.length;

while(true){

d=d/2;           //进行分组

for(int i =0;i<d;i++){

for(int x=i+d;x<array.length;x++){     //确定数组内顺序为i+d的数为一组

int temp=array[x];

int j;

for(j=x-d;j>=0&&array[j]>temp;j=j-d){       //对组内元素进行直接插入排序

array[j+d] = array[j];

}

array[j+d] = temp;

}

}

if(d == 1){

break;     //当增量d=1时结束。

}

}

System.out.println();

System.out.print("排序之后:");

for(int i=0;i<array.length;i++){

System.out.print(array[i]+" ");

}

}

}

4、分析

  我们知道一次插入排序是稳定的,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以希尔排序是不稳定的。

  希尔排序的时间性能优于直接插入排序,原因如下:

  (1)当文件初态基本有序时直接插入排序所需的比较和移动次数均较少。

  (2)当n值较小时,n和n2的差别也较小,即直接插入排序的最好时间复杂度O(n)和最坏时间复杂度0(n2)差别不大。

  (3)在希尔排序开始时增量较大,分组较多,每组的记录数目少,故各组内直接插入较快,后来增量di逐渐缩小,分组数逐渐减少,而各组的记录数目逐渐增多,但由于已经按di-1作为距离排过序,使文件较接近于有序状态,所以新的一趟排序过程也较快。

  因此,希尔排序在效率上较直接插人排序有较大的改进。

  希尔排序的平均时间复杂度为O(nlogn)。

//分析是我在其他博客上看到的,感觉分析的很透彻,可以借鉴学习一下

时间: 2024-11-07 08:36:57

Java学习-插入排序2-希尔排序的相关文章

java排序之插入排序(直接插入排序和希尔排序)

上面一片博文探讨了关于的java选择排序(冒泡排序和快速排序)本章将继续探讨java排序之插入排序,插入排序分为直接插入排序和希尔排序两种. 1.直接插入排序思想:在需要排序的一组数据中假设前该数组的前n-1(n >= 2)个数是已经排好序的,现在要把第n个数插入到前面的n-1个数中,使得这n个数也是排好顺序的.如此反复进行,知道n等于需要排序的数组的长度时.就实现了该数组的直接插入排序. 代码如下: /** * * @param a 需要排序的数组 */ public static void

插入排序,希尔排序,堆排序,归并排序,快速排序Java实现

参看:数据结构与算法分析-c语言描述 public class Main { public static void main(String[] args) { String[] a = { "a", "d", "e", "f", "m" }; String[] b = { "a", "h", "g", "l", "z&

插入排序 | 冒泡排序 | 希尔排序 | 堆排序 | 快速排序 | 选择排序 | 归并排序

以下是最近学习各种算法的代码实现: #include <stdlib.h> #include <stdio.h> #include <time.h> #include <limits.h> typedef int EleType; typedef int (*CompFunc)(void *,void *); int IntComp(void * a,void *b) { if(*(int *)a > *(int *)b) return 1; if(*

算法3 七大排序之:直接插入排序和希尔排序

上一篇总结了直接选择排序和堆排序,这一篇要总结的是插入排序中的直接插入排序和希尔排序,我们主要从以下几点进行总结. 1.直接插入排序及算法实现 2.希尔排序及算法实现 3.直接插入排序PK希尔排序 1.直接插入排序及算法实现 什么是直接插入排序呢?直接插入排序的基本思想是:每次从无序序列中取出第一个元素插入到已经排好序的有序序列中,从而得到一个新的,数量加1的有序序列. 1-1.示意图 下面是直接插入排序的图解说明. 1-2.代码 下面是直接插入排序的算法实现代码. InsertSort.jav

数据结构精要------直接插入排序和希尔排序算法

上篇总结中主要实践了算法的内排序的选择排序,那么接下来我们继续实践插入排序排序的两种:直接插入排序和希尔排序算法. -----直接插入排序 package com.sort; /** * 直接插入排序 * * @author weixing-yang * * 算法思路: * 每步将一个待排序的元素,插入到前面已排序好的一组元素中的适当位置, * 直到所有元素全部出入完成为止. */ public class InsertionSort { public void insertionSort(in

数据结构例程——插入排序之希尔排序

本文是[数据结构基础系列(9):排序]中第3课时[插入排序之希尔排序]的例程. 1.希尔排序 #include <stdio.h> #define MaxSize 20 typedef int KeyType; //定义关键字类型 typedef char InfoType[10]; typedef struct //记录类型 { KeyType key; //关键字项 InfoType data; //其他数据项,类型为InfoType } RecType; //排序的记录类型定义 void

#排序算法#【2】直接插入排序、希尔排序

直接插入排序法 插入排序的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上,在从后向前扫描过程中,需要反复把已排序元素逐步向后移动,为最新元素提供插入空间. 核心代码: //直接插入排序法 void InsertSort(int a[],int n){ int i,j,k,t; for(i = 1 ; i<n;i++){ k = a[i]; /* 第一次比较粗糙的写法 j = i-1; while(

插入排序,希尔排序,堆排序详解

本文将介绍三种排序算法--插入排序,希尔排序,堆排序.本文所有例子都是使用升序 一.插入排序 算法思想 维护一个有序数组,将要插入的数据与有序数组自最后一个元素直到合适位置的数一一比较. eg: 有序数组:1,3,5,6,7   现在待插入数据为2,那么他将会和7,6,5,3,依次作比较,当带插入数据小于有序数组最后的元素大小,则将该元素后移,直到待插入元素找到合适位置为止. 代码实现 void InsertSort(int* a, int size) 02 { 03     assert(a)

插入排序,希尔排序,堆排序

本文将介绍三种排序算法--插入排序,希尔排序,堆排序.本文所有例子都是使用升序 一.插入排序 算法思想 维护一个有序数组,将要插入的数据与有序数组自最后一个元素直到合适位置的数一一比较. eg: 有序数组:1,3,5,6,7   现在待插入数据为2,那么他将会和7,6,5,3,依次作比较,当带插入数据小于有序数组最后的元素大小,则将该元素后移,直到待插入元素找到合适位置为止. 代码实现 void InsertSort(int* a, int size) { assert(a); for (int