JAVA希尔排序算法交换法和移动法(含详细拆分代码讲解)
基本内容
希尔排序也是一种插入排序,他是简单插入排序经过改进之后的一个高效的版本,也称为缩小增量排序
插入排序的基本思想
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分为一组,算法遍终止。
一、代码的拆分讲解(逐步推导)
以数组8,9,1,7,2,3,5,4,6,0为例进逐步推导
首先进行第一趟排序
//希尔排序的第一轮排序
//因为第一轮排序,是将10个数据分成了5组
for (int i = 5; i < arr.length; i++) {
//遍历各组中所有元素(共5组,每组有2个元素),步长5
for (int j = i - 5; j >= 0; j-=5) {
//如果当前元素大于加上不长后的那个元素,说明交换
if (arr[j] > arr[j + 5]){
int temp = arr[j];
arr[j] = arr[j + 5];
arr[j + 5] = temp;
}
}
}
System.out.println("希尔排序第一轮后:");
System.out.println(Arrays.toString(arr));
第一趟的结果为
希尔排序的第二轮排序
//希尔排序的第二轮排序
//因为第二轮排序,是将10个数据分成了5/2 = 2组
for (int i = 5; i < arr.length; i++) {
//遍历各组中所有元素(共2组,每组有5个元素),步长2
for (int j = i - 5; j >= 0; j-=5) {
//如果当前元素大于加上不长后的那个元素,说明交换
if (arr[j] > arr[j + 5]){
int temp = arr[j];
arr[j] = arr[j + 5];
arr[j + 5] = temp;
}
}
}
System.out.println("希尔排序第二轮后:");
System.out.println(Arrays.toString(arr));
第二趟的结果为
希尔排序的第三轮排序
//希尔排序的第三轮排序
//因为第三轮排序,是将10个数据分成了2/2 = 1组
for (int i = 5; i < arr.length; i++) {
//遍历各组中所有元素(共1组,每组有10个元素),步长1
for (int j = i - 5; j >= 0; j-=5) {
//如果当前元素大于加上不长后的那个元素,说明交换
if (arr[j] > arr[j + 5]){
int temp = arr[j];
arr[j] = arr[j + 5];
arr[j + 5] = temp;
}
}
}
System.out.println("希尔排序第三轮后:");
System.out.println(Arrays.toString(arr));
第三趟的结果为
希尔排序的代码
public static void main(String[] args) {
int arr[] = {8,9,1,7,2,3,5,4,6,0};
ShellSort(arr);
}
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) {
// 如果当前元素大于加上后的那个元素,说明交换
if (arr[j] > arr[j + gap]) {
temp = arr[j];
arr[j] = arr[j + gap];
arr[j + gap] = temp;
}
}
}
}
System.out.println("排序后的数组为"+Arrays.toString(arr));
}