算法篇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 }
文章可随意参考借鉴,欢迎大家指正错误,如果感觉有用,点个赞就好