前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >shell排序

shell排序

作者头像
爱撒谎的男孩
发布2019-12-31 15:35:11
6160
发布2019-12-31 15:35:11
举报
文章被收录于专栏:码猿技术专栏码猿技术专栏

文章目录

1. Shell 排序

1.1. 定义

1.2. 代码实现

Shell 排序

定义

  • 希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。
  • 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
  • 该方法实质上是一种分组插入方法
  • 比较相隔较远距离(称为增量)的数,使得数移动时能跨过多个元素,则进行一次比[2] 较就可能消除多个元素交换。
  • D.L.shell于1959年在以他名字命名的排序算法中实现了这一思想。算法先将要排序的一组数按某个增量d分成若干组,每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。当增量减到1时,整个要排序的数被分成一组,排序完成。
  • 一般的初次取序列的一半为增量,以后每次减半,直到增量为1。
  • 给定实例的shell排序的排序过程
  • 假设待排序文件有10个记录,其关键字分别是:49,38,65,97,76,13,27,49,55,04。增量序列的取值依次为:5,2,1

代码实现

代码语言:javascript
复制
public class ShellSort {

	public static void main(String[] args) {

		int[] data = new int[] { 5, 3, 6, 2, 1, 9, 4, 8, 7 };
		print(data);
		shellSort(data, data.length);
		print(data);
	}

    /**
    	shell排序的实现算法,原理就是使用不同的增量进行分组,之后对每个分组进行插入排序
    */
	public static void shellSort(int[] array, int n) {
		int gap, i, j;
		//使用增量分割子序列,这里的gap就是增量,使用增量对数组进行分割
		for (gap = n / 2; gap > 0; gap /= 2)

		{
			// 内层的两个循环对每一个子序列同时做直接插入排序
			for (i = gap; i < n; i++){
				int insertNode=array[i];  //待插入的数据
				j=i-gap;   //待插入数据的前一个下标
				
				//循环结束的条件是insertNode>=array[j],那么此时的insertNode需要插入的位置就是array[j+1]这个位置了
				while(j>=0&&insertNode<array[j]){
					array[j+gap]=array[j];   //元素后移
					j=j-gap;
				}
				array[j+gap]=insertNode;   //此时的array[j+gap]就是待插入的位置
			}
		}
	}

	public static void print(int[] data) {
		for (int i = 0; i < data.length; i++) {
			System.out.print(data[i] + "\t");
		}
		System.out.println();
	}
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-07-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Shell 排序
    • 定义
      • 代码实现
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档