JAVA希尔排序代码
程序员文章站
2023-11-13 22:16:46
import untils.AlgorithmUtils;import java.util.Arrays;/** * 以下内容来源网上 * 希尔排序,也称 递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是 非稳定排序算法。 *
* 希尔排序是基于插入排序的以下两点性质而提出改进方法的: *
* 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率 * 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一...
希尔算法学习使用代码如下
import untils.AlgorithmUtils;
import java.util.Arrays;
/**
* 以下希尔排序算法解释内容来源网上
*
* 希尔排序,也称 递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是 非稳定排序算法。
*
* 希尔排序是基于插入排序的以下两点性质而提出改进方法的:
*
* 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率
* 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一
* 希尔排序是先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。
*
*/
public class Shell {
/**
* 学习使用
*
* @param arr
*/
public static void studyShellSort(int[] arr) {
System.out.print("原数组: ");
System.out.println(Arrays.toString(arr));
System.out.println("开始shell排序:--Start-- ");
int length = arr.length;
for (int len = length / 2; len > 0; len /= 2) {
boolean flag = true;
System.out.println("本次步长为: " + len);
for (int i = len; i < length; i++) {
int c = 0;
for (int j = i - len; j >= 0; c = j -= len) {
System.out.println(c + " : 原位置 = " + j + "; 原位置值 = " + arr[j] + "; 对比位置(原位置+步长) = " + (j + len) + "; 对比位置(原位置+步长值) = " + arr[j + len]);
System.out.println("原位置与对比位置比对之前为:");
System.out.println(Arrays.toString(arr));
if (arr[j] > arr[j + len]) {
AlgorithmUtils.swap(arr, j, j + len);
System.out.println("原位置与对比位置比对之后,需要交换:");
System.out.println(Arrays.toString(arr));
} else {
System.out.println("原位置不大于对比位置,不需要交换");
}
}
System.out.println();
}
//本次最终
System.out.println("最终: " + Arrays.toString(arr));
}
System.out.println("shell排序结束:--END-- ");
}
}
public class AlgorithmUtils {
public static void swap(int[] arr, int a, int b) {
arr[a] = arr[a] + arr[b];
arr[b] = arr[a] - arr[b];
arr[a] = arr[a] - arr[b];
}
}
希尔算法作为工具类使用代码如下
import untils.AlgorithmUtils;
public class Shell {
/**
*
* @param arr 传入数组
* @return 返回数组
*/
public static int[] shellSort(int[] arr) {
int length = arr.length;
for (int len = length / 2; len > 0; len /= 2) {
for (int i = len; i < length; i++) {
for (int j = i - len; j >= 0; j -= len) {
if (arr[j] > arr[j + len]) {
AlgorithmUtils.swap(arr, j, j + len);
}
}
}
}
return arr;
}
}
本文地址:https://blog.csdn.net/xplan5/article/details/112102614
上一篇: 两部同时充 南孚推全球首款双位无线充