交换式代码:
public static void shellSort(int[] arr){ //交换式 int temp = 0; //int count = 0; for (int grp = arr.length / 2; grp > 0; grp /= 2) { for (int i = grp; i < arr.length; i++) { for (int j = i - grp; j >= 0; j -= grp) { //如果当前元素大于加上步长后的那个元素,说明交换 if (arr[j] > arr[j + grp]) { temp = arr[j]; arr[j] = arr[j + grp]; arr[j + grp] = temp; } } } //System.out.println("希尔排序第"+(++count)+"次排序结果:"+Arrays.toString(arr)); }位移式代码:
public static void shellSort2(int[] arr){ //对交换式希尔排序进行优化-->位移式 明显提升速度 //int count = 0; //增量gap,并逐步的缩小增量 for (int grp = arr.length / 2; grp > 0; grp /= 2) { //从gap个元素,逐个对其所在的组进行直接插入排序 for (int i = grp; i < arr.length; i++){ int j = i; int temp = arr[j]; if (arr[j] < arr[j - grp]){ while (j - grp >= 0 && temp < arr[j - grp]){ arr[j] = arr[j - grp]; j -= grp; } //当退出while循环后,就给temp找到了插入的位置 arr[j] = temp; } } //System.out.println("希尔排序第"+(++count)+"次排序结果:"+Arrays.toString(arr)); } }主程序(对两种方法进行速度测试):
public static void main(String[] args) { //int[] arr = {8,9,1,7,2,3,5,4,6,0}; //测试运行速度 //创建八万个数据 int[] arr2 = new int[80000]; for (int i = 0; i < 80000; i++){ arr2[i] = (int)(Math.random() * 80000); //生成一个[0,80000]的随机数 } Date data1 = new Date(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String date1Str = simpleDateFormat.format(data1); System.out.println("排序前的时间是=" + date1Str); //shellSort(arr2); shellSort2(arr2); Date data2 = new Date(); String date2Str = simpleDateFormat.format(data2); System.out.println("排序前的时间是=" + date2Str); }完整代码:
package com.shell; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; public class ShellSort { public static void main(String[] args) { //int[] arr = {8,9,1,7,2,3,5,4,6,0}; //测试运行速度 //创建八万个数据 int[] arr2 = new int[80000]; for (int i = 0; i < 80000; i++){ arr2[i] = (int)(Math.random() * 80000); //生成一个[0,80000]的随机数 } Date data1 = new Date(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String date1Str = simpleDateFormat.format(data1); System.out.println("排序前的时间是=" + date1Str); //shellSort(arr2); shellSort2(arr2); Date data2 = new Date(); String date2Str = simpleDateFormat.format(data2); System.out.println("排序前的时间是=" + date2Str); } //使用逐步推导的方式编写希尔排序 public static void shellSort(int[] arr){ //交换式 int temp = 0; //int count = 0; for (int grp = arr.length / 2; grp > 0; grp /= 2) { for (int i = grp; i < arr.length; i++) { for (int j = i - grp; j >= 0; j -= grp) { //如果当前元素大于加上步长后的那个元素,说明交换 if (arr[j] > arr[j + grp]) { temp = arr[j]; arr[j] = arr[j + grp]; arr[j + grp] = temp; } } } //System.out.println("希尔排序第"+(++count)+"次排序结果:"+Arrays.toString(arr)); } public static void shellSort2(int[] arr){ //对交换式希尔排序进行优化-->位移式 明显提升速度 //int count = 0; //增量gap,并逐步的缩小增量 for (int grp = arr.length / 2; grp > 0; grp /= 2) { //从gap个元素,逐个对其所在的组进行直接插入排序 for (int i = grp; i < arr.length; i++){ int j = i; int temp = arr[j]; if (arr[j] < arr[j - grp]){ while (j - grp >= 0 && temp < arr[j - grp]){ arr[j] = arr[j - grp]; j -= grp; } //当退出while循环后,就给temp找到了插入的位置 arr[j] = temp; } } //System.out.println("希尔排序第"+(++count)+"次排序结果:"+Arrays.toString(arr)); } } }