【排序算法】(8)希尔排序
时间:2019-11-10
本文章向大家介绍【排序算法】(8)希尔排序,主要包括【排序算法】(8)希尔排序使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
希尔排序
2019-11-10 11:44:39 by冲冲
1、概念
希尔排序(shell排序),是插入排序(直接插入)的增强版。
特点是,在不断缩小增量的过程中,不断地排序,使得在最终使用插入排序时,序列已经基本有序。插入排序在操作基本有序的序列时效率倍增。
2、基本思想
把序列按步长gap分组,对每组小序列采用直接插入排序方法进行排序。
随着步长逐渐减小,所分成的组包含的记录越来越多,当步长的值减小到1时,整个数据合成为一组,构成一组基本有序的序列,进行最后一趟插入排序,完成排序。
例析,
初始时,有一个大小为 10 的无序序列。
在第一趟排序中,设置 gap1 = N / 2 = 5,即相隔距离为 5 的元素组成一组,可以分为 5 组。然后使用直接插入排序的方法对每个组进行排序。
在第二趟排序中,设置 gap2 = gap1 / 2 = 2 (取整数)。即每相隔距离为 2 的元素组成一组,可以分为 2 组。然后使用直接插入排序的方法对每个组进行排序。
在第三趟排序中,设置gap3 = gap2 / 2 = 1。 即相隔距离为 1 的元素组成一组,即只有一组。然后使用直接插入排序的方法对每个组进行排序。此时,排序已经结束。
希尔排序是不稳定性排序:图中有两个相等数值的元素 5 和 5,在排序过程中,两个元素位置交换了。
3、完整代码
1 public class ShellSort { 2 public static void main(String[] args){ 3 int[] array = {9, 1, 2, 5, 7, 4, 8, 6, 3, 5}; 4 5 // 调用希尔排序方法 6 ShellSort shell = new ShellSort(); 7 System.out.print("排序前:\t\t"); 8 shell.printAll(array); 9 shell.shellSort(array); 10 System.out.print("排序后:\t\t"); 11 shell.printAll(array); 12 } 13 14 public void shellSort(int[] list) { 15 int gap = list.length / 2; 16 17 while (1 <= gap) { 18 // 把距离为 gap 的元素编为一个组,扫描所有组 19 for (int i = gap; i < list.length; i++) { 20 int j = 0; 21 int temp = list[i]; 22 23 // 对距离为 gap 的元素组进行排序 24 for (j = i - gap; j >= 0 && temp < list[j]; j = j - gap) { 25 list[j + gap] = list[j]; 26 } 27 list[j + gap] = temp; 28 } 29 30 System.out.format("gap = %d:\t", gap); 31 printAll(list); 32 gap = gap / 2; // 减小增量 33 } 34 } 35 36 // 打印完整序列 37 public void printAll(int[] list) { 38 for (int value : list) { 39 System.out.print(value + "\t"); 40 } 41 System.out.println(); 42 } 43 44 }
1 排序前: 9 1 2 5 7 4 8 6 3 5 2 gap = 5: 4 1 2 3 5 9 8 6 5 7 3 gap = 2: 2 1 4 3 5 6 5 7 8 9 4 gap = 1: 1 2 3 4 5 5 6 7 8 9 5 排序后: 1 2 3 4 5 5 6 7 8 9
原文地址:https://www.cnblogs.com/yadiel-cc/p/11829405.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- linux 平均负载 load average 的含义【转】
- zookeeper-01 概述
- zookeeper-02 部署
- zookeeper-03 命令行操作
- java连接zookeeper服务器出现“KeeperErrorCode = ConnectionLoss for ...”
- Linux 内存使用率
- CentOS7.4下编译Hadoop-2.7.6
- VMware安装CentOS6
- VMware安装CentOS7 3.1 主机名修改3.2 网卡名修改3.3 ifconfig安装
- VMware网络设置
- Destoon 6.0 guestbook.php 通用SQL注入漏洞
- Hadoop2.7.6_01_部署
- Hadoop2.7.6_02_HDFS常用操作
- Bottle HTTP 头注入漏洞探究
- Hadoop2.7.6_03_HDFS原理