7.8希尔排序
希尔排序法介绍:
希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序
希尔排序法基本思想:
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序; 随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止
希尔排序算法示意图:
package com.atguigu06.sort;
/**
* @author peng
* @date 2021/11/19 - 15:43
* <p>
* 实现希尔排序
* 希尔排序的主要思想是:
* 1、将数组进行分组, 每一组内进行比较,小的放前面;
* 2、继续分组执行第一步的操作,直到每一组的个数为一;
* 3、使用插入排序算法,对进行分组之后的数组排序,得出最后的结果
*/
public class ShellSort {
public static void main(String[] args) {
//创建待排序的数组
int[] array = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};
//调用希尔排序算法:交换法
shellSort(array);
System.out.println();
//调用希尔排序:移位法
shellSort2(array);
}
/**
* 希尔排序算法:交换法
*/
public static void shellSort(int[] array) {
int temp = 0;
for (int gap = array.length / 2; gap > 0; gap /= 2) {//控制每一轮分组的数量
for (int i = gap; i < array.length; i++) {
//控制后一个数的起始位置,一般是同一个组的第一个元素的后一位
for (int j = i - gap; j >= 0; j -= gap) {
//这是前一个数的起始位置,一般是同一个组的第一个数字也就是位置0
if (array[j] > array[j + gap]) {
//如果发现同一组的后一个数小于前一个数,那么就交换两个数的位置
temp = array[j];
array[j] = array[j + gap];
array[j + gap] = temp;
}
}
}
}
//输出希尔排序之后的数组
for (int value : array) {
System.out.print(value + "\t");
}
}
/**
* 希尔排序:移位法
*/
public static void shellSort2(int[] array) {
for (int gap = array.length / 2; gap > 0; gap = gap / 2) {
for (int i = gap; i < array.length ; i++) {
int j = i;//用于保存i的位置
int temp = array[j];//保存当前要交换的那个元素
if (array[j] < array[j - gap]) {
//如果后面的哪一个元素比前面的那个元素小,那么就要交换位置,准备交换位置
while (j - gap >=0 && temp < array[j - gap]) {
//如果还有满足条件的元素, 那么就继续向前寻找
array[j] = array[j - gap];
j -= gap;
}
//如果走出了循环,说明找到了要交换的那个元素应该插入的位置
array[j] = temp;//插入元素
}
}
}
System.out.println("输出希尔排序之后的数组:");
for (int temp : array) {
System.out.print(temp + "\t");
}
}
}