数组排序-希尔排序Java实现

版权声明:转载请标明出处 https://blog.csdn.net/weixin_40661297/article/details/87968387

希尔排序:
核心思想:

  1. 将数组arr按照等差的思想分为几个小数组,分组的梯度为gap
    如arr={1,13,15,3,8,5,2,9,12,6};设gap初始为5,即为递增值,小数组分为{1,5},{13,2},{15,9},{3,12},{8,6},用插入排序对小数组排序,得{1,5},{2,13},{9,15},{3,12},{6,8}。PS:不是真的声明了数组,还是在arr中操作的,(准确来说是排序小组)只不过每次插入排序不是针对所有对象,而是分组排序,第一次排序后结果为1,2,9,3,6,5,13,15,12,8。然后将gap减小,一般为gap/2,这里取2,小数组就为,{1,9,6,13,12}和{2,3,5,15,8},对这俩插入排序得{1,6,9,12,13}和{2,3,5,8,15},最后gap为1,对{1,2,6,3,9,5,12,8,13,15}插入排序得{1,2,3,5,6,8,9,12,13,15}
  2. 本例中对小数组的排序不是第K个小数组完全排好了再排第K+1个小数组,而是第K个小数组排好了第n位,第K+1个小数小数组再排第n位,然后第K+2,K+3…然后第K个小数组排n+1位,第K+1个小数组排n+1位,第K+2个小数组排n+1位,…这样轮流着来的(后面第二个例子实现了第1个小组数先排号再排第二个小数组,然后类推,哈哈哈,机智如我)
package MySort;

import java.util.Arrays;

/**
 * 希尔排序
 * @author Archerlu
 *
 */
public class ShellSortTest {

	public static void main(String[] args) {
		int[] arr = {1,13,5,8,15,4,32,90,56,34,2,44};
		
		shellSort(arr);
		System.out.println(Arrays.toString(arr));
	}

	//希尔排序,核心为确定递增值gap,分小数组,等差序列为一个数组;然后gap逐渐减小至1,
	private static void shellSort(int[] arr) {
		int length = arr.length;
		for (int gap = length/2;gap>0;gap=gap/2) {
			for (int i=gap;i<length;i++) {
				insetSort(arr,gap,i);
			}
		}
	
	}
	
	//插入排序
	private static void insetSort(int[] arr, int gap, int i) {
		int temp = arr[i];
		int j;
		for (j=i-gap;j>0&&temp<arr[j];j=j-gap) {
			arr[j+gap]=arr[j];
		}
		arr[j+gap]=temp;//因为多执行一步j-gap
	}
}

代码2,实现了第一个小数组先排好载排下一个,个人感觉下面这个更好理解一点,主要的区别是for (int i=gap;i<length;i++) 这个循环语句代码2是for (int i=0;i<gap;i++)

package MySort;

import java.util.Arrays;

/**
 * 希尔排序
 * @author Archerlu
 *
 */
public class ShellSortTest2 {

	public static void main(String[] args) {
		int[] arr = {1,13,5,8,15,4,32,90,56,34,2,44,100,13};
		
		shellSort(arr);
		System.out.println(Arrays.toString(arr));
	}

	//希尔排序,核心为确定递增值gap,分小数组,等差序列为一个数组;然后gap逐渐减小至1,
	private static void shellSort(int[] arr) {
		int length = arr.length;
		for (int gap = length/2;gap>0;gap=gap/2) {
			for (int i=0;i<gap;i++) {
				insetSort(arr,gap,i);
			}
		}
	
	}
	
	//插入排序
	private static void insetSort(int[] arr, int gap, int i) {
		
		for (int j=i+gap;j<arr.length;j=j+gap){
			int temp = arr[j];
			int k;
			for (k=j;k>gap-1&&temp<arr[k-gap];k=k-gap){
				arr[k]=arr[k-gap];
			}
			arr[k]=temp;
		}
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_40661297/article/details/87968387