vlambda博客
学习文章列表

希尔排序的介绍和希尔排序基本思想以及代码实现

希尔排序介绍

希尔排序是希尔(Donald Shell)于1950年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。

希尔排序基本思想

希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止.


代码实现:


package Sort;
import java.util.Arrays;
public class SheelSort {   public static void main(String[] args) { int []arr1= new int[800000]; int []arr2= new int[800000]; for(int i=0;i<800000;i++) { arr1[i]=(int)(Math.random()*800000); arr2[i]=(int)(Math.random()*800000); } //获取当前时间与1970年1月1日0时0分0秒的时间差,单位是毫秒; long s1=System.currentTimeMillis(); shellSort(arr1); System.out.println("交换式的希尔排序用时"+((System.currentTimeMillis()-s1)/1000)); long s2=System.currentTimeMillis(); shellSort2(arr2); System.out.println("移动式的希尔排序用时"+((System.currentTimeMillis()-s2)/1000)); //System.out.println(Arrays.toString(arr)); } //交换法 public static void shellSort(int[] arr) { int temp=0; for(int gap=arr.length/2;gap>0;gap/=2) { for(int i=gap;i<arr.length;i++) { for(int j=i-gap;j>=0;j-=gap) { if(arr[j]>arr[j+gap]) { temp=arr[j]; arr[j]=arr[j+gap]; arr[j+gap]=temp; } } } } }  //移动法 public static void shellSort2(int[] arr) { int temp=0; for(int gap=arr.length/2;gap>0;gap/=2) { for(int i=gap;i<arr.length;i++) { int j=i; temp=arr[j]; if(arr[j]<arr[j-gap]) { while(j-gap>=0&&arr[j]<arr[j-gap]) { arr[j]=arr[j-gap]; j-=gap; } } arr[j]=temp; } } }
}

为了检验希尔排序时, 对有序序列在插入时采用交换法和对有序序列在插入时采用移动法的比较,随机生成800000个数字,对其进行排序,检验出,在面对大量数据时,采用移动法的速度明显比交换法的强,数据越多,差别越大,下面是他两的运行时间: