算法篇3:排序算法(下篇)

八:希尔排序(又称增量递减排序)

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

举例说明::初始需排序数组 int[] arr = {3,7,2,9,1,4,6,8,10,5};

第一趟:数组长度为【10】,我们选择增量  gap = length / 2 = 5;

则将初始数组分为{ 3,4}  ,{7,6}, { 2,8},{9,10} ,{1,5}分别对其排序为 { 3,4}  ,{6,7}, { 2,8},{9,10} ,{1,5}

则数组变为{ 3,6,2,9,1 , 4 , 7 , 8 , 10 , 5}

第二趟:增量递减,我们选择gap = gap /2 = 2;

  则将匹配的为{ 3,2,1,7,10 }和{6,9,4,8,5}排序为{1,2,3,7,10}和{4,5,6,8,9 }

则数组变为{1,4,2,5,3,6,7,8,10,9 }

第三趟:增量递减,选择 gap = gap /2 =1 :则分为{1,4,2,5,3,6,7,8,10,9 }排序结果为{1,2,3,4,5,6,7,8,9,10 }

代码实现:这里在有序序对插入时选择使用交换法,还可以使用其他的方法,比如移动法,都可以

 1 package com.xqc.sort;
 2 
 3 import java.util.Arrays;
 4 
 5 /**
 6  * 希尔排序
 7  * @author Administrator
 8  *
 9  */
10 public class ShellSort {
11     public static void main(String []args){
12         int []arr ={3,7,2,9,1,4,6,8,10,5};
13         ShellSortSwap(arr);
14         System.out.println(Arrays.toString(arr));
15     }
16 
17     /**
18      * 希尔排序 针对有序序列在插入时采用交换法
19      * @param arr
20      */
21     public static void ShellSortSwap(int []arr){
22         //增量gap,并逐步缩小增量
23        for(int gap=arr.length/2;gap>0;gap/=2){
24            //从第gap个元素,逐个对其所在组进行直接插入排序操作
25            for(int i=gap;i<arr.length;i++){
26                int j = i;
27                while(j-gap>=0 && arr[j]<arr[j-gap]){
28                    //插入排序采用交换法
29                    swap(arr,j,j-gap);
30                    j-=gap;
31                }
32            }
33        }
34     }
35     /**
36      * 交换数组元素
37      * @param arr
38      * @param a
39      * @param b
40      */
41     public static void swap(int []arr,int a,int b){
42         arr[a] = arr[a]+arr[b];
43         arr[b] = arr[a]-arr[b];
44         arr[a] = arr[a]-arr[b];
45     }
46     
47     /**
48      * 希尔排序 针对有序序列在插入时采用移动法。
49      * @param arr
50      */
51     public static void ShellSortMove(int []arr){
52         //增量gap,并逐步缩小增量
53         for(int gap=arr.length/2;gap>0;gap/=2){
54             //从第gap个元素,逐个对其所在组进行直接插入排序操作
55             for(int i=gap;i<arr.length;i++){
56                 int j = i;
57                 int temp = arr[j];
58                 if(arr[j]<arr[j-gap]){
59                     while(j-gap>=0 && temp<arr[j-gap]){
60                         //移动法
61                         arr[j] = arr[j-gap];
62                         j-=gap;
63                     }
64                     arr[j] = temp;
65                 }
66             }
67         }
68     }
69     
70 }

 

posted @ 2018-08-27 11:15  阿苍老师  阅读(68)  评论(0编辑  收藏  举报