希尔排序

原创 2018年04月16日 10:58:22
希尔排序,是在插入排序的基础上改进过来的。直接插入排序,当数据量很大,且数据都无序时,进行排序消耗较高,引申出了采用增量排序,不断减小增量,当增量为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];
    }


}

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013013553/article/details/79957770

希尔排序与快速排序

上节讲的归并排序运行速度比简单排序块,但是它需要的空间是原始数组空间的两倍;通常这是一个严重的缺点         希尔排序,希尔排序的时间复杂度是O(N*(logN)^2)。希尔排序是基于插入排序...
  • yubotianxiao
  • yubotianxiao
  • 2016-07-15 16:50:03
  • 683

希尔排序理解

转载地址: http://blog.csdn.net/cjf_iceking/article/details/7951481  插入排序的算法复杂度为O(n2),但如果序列为正序可提高到O(n),...
  • jianfpeng241241
  • jianfpeng241241
  • 2016-06-18 22:53:58
  • 5395

数据结构系列之希尔排序详解

基于插入排序的希尔排序Java实现
  • fengyinchao
  • fengyinchao
  • 2015-05-27 09:25:47
  • 2070

【算法-排序之四】希尔排序

算法-排序之希尔排序     希尔排序得名于其设计者设计者希尔(Donald Shell),设计体现了计算机领域的“分治法”思想。在众多排序算法中,目前而言,希尔排序是唯一能在效率上与快...
  • Jiangweihll
  • Jiangweihll
  • 2014-03-25 20:56:26
  • 9020

【排序算法】希尔排序原理及Java实现

希尔排序也成为“缩小增量排序”,其基本原理是,现将待排序的数组元素分成多个子序列,使得每个子序列的元素个数相对较少,然后对各个子序列分别进行直接插入排序,待整个待排序列“基本有序”后,最后在对所有元素...
  • jianyuerensheng
  • jianyuerensheng
  • 2016-04-27 09:19:55
  • 14169

数据结构----希尔排序(最小增量排序)

1.基本思想:算法现将要排序的一组数按某个增量d(n/2,n为要排序数的个数) 分成若干组,每组中记录的下标相差d。对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每...
  • s646575997
  • s646575997
  • 2016-05-20 22:07:19
  • 2461

关于希尔排序的时间复杂度分析

希尔排序又叫做“缩小增量排序”,它也是一种属于插入排序类的方法,但是在时间复杂度上又有了改进。它的基本思想是,先将整个待排序记录分割为若干个子序列分别插入排序,待整个序列中的记录基本有序是,,再对全体...
  • white_hairpin
  • white_hairpin
  • 2017-03-27 21:27:16
  • 2436

排序算法之直接插入排序和希尔排序

相信许多人和我一样,排序算法看了好几遍,当时看懂了,过几天一些细节又忘记,所以现在讲排序算法做一个总结,从最基本的排序算法展开来,首先分析直接插入排序和希尔排序。 1.直接插入排序 思想:把一个数...
  • lierjin312158950
  • lierjin312158950
  • 2016-04-09 15:55:33
  • 834

关于希尔排序的整理

今天在牛客网刷笔试题,看到了一题关于希尔排序的,之前上数据结构课也没有讲过,现在也只能说知道那道题怎么做了。      先上题目。对序列{15,9,7,8,20,-1,4}进行排序,进行一趟后数据的...
  • Sagitarioo
  • Sagitarioo
  • 2016-08-18 19:38:40
  • 387

归并排序和希尔排序

一、归并排序 归并排序的时间复杂度为O(nlogn) 这是该算法中最好、最坏和平均的时间性能。 其中比较操作的次数介于(nlogn) / 2和nlogn - n + 1(在每次归并中比较次数不...
  • taiyanggongsi
  • taiyanggongsi
  • 2015-06-18 12:38:50
  • 782
收藏助手
不良信息举报
您举报文章:希尔排序
举报原因:
原因补充:

(最多只允许输入30个字)