希尔排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013013553/article/details/79957770
在写之前,总结一句话,希尔排序就是增量排序。希尔排序,是在插入排序的基础上改进过来的。直接插入排序,当数据量很大,且数据都无序时,进行排序消耗较高,引申出了采用增量排序,不断减小增量,当增量为1时,数组有序。
package yoozoo.day1;

import java.util.Arrays;

public class Test11 {

	//希尔排序
	public static void main(String[] args) {
		//希尔排序是在插入排序的基础上改进过来的,当数据量很大,且都无序的情况下,
		//采用希尔排序比直接插入排序好,它是不稳定排序算法,时间复杂度为O(n^2),空间复杂度为O(1)
		//它的思想是,逐步减小间隙,使整个数组有序,一开始gap为length/2
		
		int[] arr = {2,1,7,4,9,11};
		sort(arr);
		System.out.println(Arrays.toString(arr));
		int[] arr1 = {3,2,18,5,9,0};
		sort1(arr1);
		System.out.println(Arrays.toString(arr1));

	}
	
	/**
     * 希尔排序 针对有序序列在插入时采用交换法
     * @param arr
     */
    public static void sort(int []arr){
        //增量gap,并逐步缩小增量
       for(int gap=arr.length/2;gap>0;gap/=2){
           //从第gap个元素,逐个对其所在组进行直接插入排序操作
           for(int i=gap;i<arr.length;i++){
               int j = i;
               while(j-gap>=0 && arr[j]<arr[j-gap]){
                   //插入排序采用交换法
                   swap(arr,j,j-gap);
                   j-=gap;//这句话没有太大意义
               }
           }
       }
    }

    /**
     * 希尔排序 针对有序序列在插入时采用移动法。
     * @param arr
     */
    public static void sort1(int []arr){
        //增量gap,并逐步缩小增量
        for(int gap=arr.length/2;gap>0;gap/=2){
            //从第gap个元素,逐个对其所在组进行直接插入排序操作
            for(int i=gap;i<arr.length;i++){
                int j = i;
                int temp = arr[j];
                if(arr[j]<arr[j-gap]){
                    while(j-gap>=0 && temp<arr[j-gap]){
                        //移动法
                        arr[j] = arr[j-gap];
                        j-=gap;
                    }
                    arr[j] = temp;
                }
            }
        }
    }
    /**
     * 交换数组元素
     * @param arr
     * @param a
     * @param b
     */
    public static void swap(int []arr,int a,int b){
        arr[a] = arr[a]+arr[b];
        arr[b] = arr[a]-arr[b];
        arr[a] = arr[a]-arr[b];
    }


}

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页