希尔排序是希尔(DonaldShell)于 1959 年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含 的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。 希尔排序按照步长减少排序的次数,按照步长分为不同的组,每组进行比较,然后排序,本质上还是插入排序。 一、交换法 这个交换耗费的时间比较多 具体实现如下:
//希尔排序之交换法 public static void shellsort(int [] arr) { //设置临时变量 int temp=0; int count=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) { //如果前一个数大于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) { //设置步长 for (int gap=arr.length/2; gap>0 ; gap/=2) { //按照步长来分组 for (int i = gap; i <arr.length ; i++) { //设置j的位置 int j=i; //存储起来 int temp=arr[j]; //如果小于前面的交换 if (arr[j]<arr[j-gap]) { //判断是否越界和是否小于前面的交换 while (j-gap>=0&&temp<arr[j-gap]) { //交换 arr[j]=arr[j-gap]; //减掉步长 j-=gap; } //交换 arr[j]=temp; } } } }