17 -- 排序算法之希尔排序

 

 希尔排序算法介绍:

希尔排序是希尔于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。

写入排序法的基本思想:

希尔排序十八记录按下标的一定增量分组,对每组使用直接插入算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰号被分作一组,算法便终止。

希尔排序算法示意图:

 

 

 

 

 方法一【交换法】:

 1 import java.util.Arrays;
 2 
 3 //希尔排序算法
 4 public class ShellSort {
 5 
 6     public static void main(String[] args) {
 7         int[] arr = {8,9,1,7,2,3,5,4,6,0};
 8         shellSort(arr);
 9         loopShellSort(arr);
10     }
11     
12     public static void loopShellSort(int[] arr) {
13         int tmp = 0;
14         int count = 0;
15         for(int gap = arr.length/2; gap > 0; gap /= 2) {
16             for(int i = gap; i < arr.length; i++) {
17                 for(int j = i - gap; j >= 0; j -= gap) {
18                     if (arr[j] > arr[j+gap]) {
19                         tmp = arr[j];
20                         arr[j] = arr[j+gap];
21                         arr[j+gap] = tmp;
22                     }
23                 }
24             }
25             System.out.println("第" + (++count) + "轮:" + Arrays.toString(arr));
26         }
27     }
28     
29     public static void shellSort(int[] arr) {
30         int tmp = 0;
31         for(int i = 5; i < arr.length; i++) {
32             for(int j = i-5; j >= 0; j -= 5) { //步长为5【即相隔5个为一组】
33                 if (arr[j] > arr[j+5]) {
34                     tmp = arr[j];
35                     arr[j] = arr[j+5];
36                     arr[j+5] = tmp;
37                 }
38             }
39         }
40         System.out.println("第1轮排序后:" + Arrays.toString(arr));
41         
42         for(int i = 2; i < arr.length; i++) {
43             for(int j = i-2; j >= 0; j -= 2) { //步长为2【即相隔2个为一组】
44                 if (arr[j] > arr[j+2]) {
45                     tmp = arr[j];
46                     arr[j] = arr[j+2];
47                     arr[j+2] = tmp;
48                 }
49             }
50         }
51         System.out.println("第2轮排序后:" + Arrays.toString(arr));
52         
53         for(int i = 1; i < arr.length; i++) {
54             for(int j = i-1; j >= 0; j -= 1) { //步长为1【即相隔1个为一组】
55                 if (arr[j] > arr[j+1]) {
56                     tmp = arr[j];
57                     arr[j] = arr[j+1];
58                     arr[j+1] = tmp;
59                 }
60             }
61         }
62         System.out.println("第3轮排序后:" + Arrays.toString(arr));
63     }
64 
65 }

shellSort方法是演变希尔排序算法的过程,而loopShellSort方法是总结其规律,然后用循环实现,再次展示示例程序执行结果:

 优化:使用移位法:

 

posted @ 2022-09-29 19:19  羽梦齐飞  阅读(18)  评论(0)    收藏  举报