基本介绍:
- 希尔排序是希尔(Donald Shell)于1959年提出的一种算法,希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更搞笑的版本,也称为缩小增量排序。
基本思想:
- 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序,随着增量主键减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
- 希尔排序方式:
- 对有序序列在插入时采用交换法;
实例代码:
private static void shellSortAscByExchange(int[] array) {
/*用于交换中间值*/
int tempValue;
/*将数组元素进行分组,初始组数为元素长度的1/2,步长为组数*/
for (int gap = array.length / 2; gap > 0; gap /= 2) {
/*从第gap个元素,逐个对其所在组进行插入排序操作*/
for (int i = gap; i < array.length; i++) {
/*对组内元素进行遍历,依次对组内的元素和组内已完成排序的元素进行对比,直至到正确的位置
* 1、j = i - gap:判断组内当前位置前是否还有元素,如果有元素,就用当前元素和前面的元素进行比较,不满元顺序
* 则交换当前位置元素和前面的元素,避免越下界
* 2、j -= gap:依次用当前元素和组内前面的元素比较,直到找到合适的位置*/
for (int j = i - gap; j >= 0; j -= gap) {
/*如果组内元素的值顺序不对,对组内元素进行交换*/
if (array[j] > array[j + gap]) {
tempValue = array[j];
array[j] = array[j + gap];
array[j + gap] = tempValue;
}
}
}
}
}
- 对有序序列在插入时采用移动发。
private static void shellSortAscByMove(int[] array) {
/*用于交换中间值*/
int tempValue;
/*将数组元素进行分组,初始组数为元素长度的1/2,*/
for (int gap = array.length / 2; gap > 0; gap /= 2) {
/*对组内元素进行遍历,依次对组内的元素和组内已完成排序的元素进行对比,直至到正确的位置*/
for (int i = gap; i < array.length; i++) {
int j = i;
tempValue = array[j];
/*如果当前值小于前一位置元素,对数组内的元素进行位置挪动,最终j所指向的位置即为当前元素应处的位置*/
while (j - gap >= 0 && tempValue < array[j - gap]) {
array[j] = array[j - gap];
j -= gap;
}
array[j] = tempValue;
}
}
}