算法03 七大排序之:直接插入排序和希尔排序
时间:2022-05-04
本文章向大家介绍算法03 七大排序之:直接插入排序和希尔排序,主要内容包括1、直接插入排序及算法实现、1-2、代码、2、希尔排序及算法实现、2-2、代码、3、直接插入排序PK希尔排序、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
上一篇总结了直接选择排序和堆排序,这一篇要总结的是插入排序中的直接插入排序和希尔排序,我们主要从以下几点进行总结。
1、直接插入排序及算法实现
2、希尔排序及算法实现
3、直接插入排序PK希尔排序
1、直接插入排序及算法实现
什么是直接插入排序呢?直接插入排序的基本思想是:每次从无序序列中取出第一个元素插入到已经排好序的有序序列中,从而得到一个新的,数量加1的有序序列。
1-1、示意图
下面是直接插入排序的图解说明。
1-2、代码
下面是直接插入排序的算法实现代码。
InsertSort.java
public class InsertSort {
public static void main(String[] args) {
int[] list = {90, 10, 20, 50, 70, 40, 80, 60, 30, 52};
System.out.println("************直接插入排序************");
System.out.println("排序前:");
display(list);
System.out.println("");
System.out.println("排序后:");
insertSort(list);
display(list);
}
/**
* 直接插入排序算法
*/
public static void insertSort(int[] list) {
// 从无序序列中取出第一个元素 (注意无序序列是从第二个元素开始的)
for (int i = 1; i < list.length; i++) {
int temp = list[i];
int j;
// 遍历有序序列
// 如果有序序列中的元素比临时元素大,则将有序序列中比临时元素大的元素依次后移
for (j = i - 1; j >= 0 && list[j] > temp; j--) {
list[j + 1] = list[j];
}
// 将临时元素插入到腾出的位置中
list[j + 1] = temp;
}
}
/**
* 遍历打印
*/
public static void display(int[] list) {
System.out.println("********展示开始********");
if (list != null && list.length > 0) {
for (int num :
list) {
System.out.print(num + " ");
}
System.out.println("");
}
System.out.println("********展示结束********");
}
}
测试结果:
2、希尔排序及算法实现
希尔排序是直接插入排序的一种更高效的改进版本,又称为“缩小增量排序”。
2-1、示意图
2-2、代码
ShellSort.java
public class ShellSort {
public static void main(String[] args) {
int[] list = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};
System.out.println("************希尔排序************");
System.out.println("排序前:");
display(list);
System.out.println("");
System.out.println("排序后:");
shellSort(list);
display(list);
}
/**
* 希尔排序算法
*/
public static void shellSort(int[] list) {
// 取增量
int gap = list.length / 2;
while (gap >= 1) {
// 无序序列
for (int i = gap; i < list.length; i++) {
int temp = list[i];
int j;
// 有序序列
for (j = i - gap; j >= 0 && list[j] > temp; j = j - gap) {
list[j + gap] = list[j];
}
list[j + gap] = temp;
}
// 缩小增量
gap = gap / 2;
}
}
/**
* 遍历打印
*/
public static void display(int[] list) {
System.out.println("********展示开始********");
if (list != null && list.length > 0) {
for (int num :
list) {
System.out.print(num + " ");
}
System.out.println("");
}
System.out.println("********展示结束********");
}
}
测试结果:
3、直接插入排序PK希尔排序
既然希尔排序是直接插入排序的改进版,我们就来测试一下希尔排序是否真的比直接插入排序更快?
代码:
InsertSortPkShellSort.java
public class InsertSortPkShellSort {
public static void main(String[] args) {
testInsertSort();
testShellSort();
}
/**
* 测试直接插入排序耗费的时间
*/
public static void testInsertSort() {
int[] list = new int[10000];
for (int i = 0; i < 10000; i++) {
list[i] = (int) (Math.random() * 100000);
}
// 直接插入排序
long start = System.currentTimeMillis();
InsertSort.insertSort(list);
long end = System.currentTimeMillis();
System.out.println("直接插入排序耗费的时间:" + (end - start));
display(list);
}
/**
* 测试希尔排序耗费的时间
*/
public static void testShellSort() {
int[] list = new int[10000];
for (int i = 0; i < 10000; i++) {
list[i] = (int) (Math.random() * 100000);
}
// 希尔排序
long start = System.currentTimeMillis();
ShellSort.shellSort(list);
long end = System.currentTimeMillis();
System.out.println("希尔排序耗费的时间:" + (end - start));
display(list);
}
/**
* 遍历打印前10个数
*/
public static void display(int[] list) {
System.out.println("********排序之后的前10个数start********");
if (list != null && list.length > 0) {
for (int i = 0; i < 10; i++) {
System.out.print(list[i] + " ");
}
System.out.println("");
}
System.out.println("********排序之后的前10个数end**********");
System.out.println("");
}
}
测试结果:
从测试结果可以看出,希尔排序比直接插入排序更快。
- Linux给用户添加sudo权限
- 博弈论入门之威佐夫博弈
- jQuery插件 -- Form表单插件jquery.form.js
- PHP验证手机号码和归属地 PHP函数代码
- 浅谈PHP 5中垃圾回收算法的演化
- POJ 2484 A Funny Game(智商博弈)
- php pathinfo()的用法
- BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏(SG函数)
- 微信公众平台开发
- BZOJ 1115: [POI2009]石子游戏Kam (阶梯nim)
- php性能监测模块XHProf
- BZOJ 1022: [SHOI2008]小约翰的游戏John (Anti-nim)
- 洛谷P2252 取石子游戏(威佐夫博弈)
- HDU 3032 Nim or not Nim?(Multi-Nim)
- 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 数组属性和方法
- 迭代加深搜索-POJ 3134 Power Calculus
- 浙大版《C语言程序设计(第3版)》题目集 习题9-2 计算两个复数之积
- 浙大版《C语言程序设计(第3版)》题目集 习题9-6 按等级统计学生成绩
- 实战|用pandas+PyQt5制作一款数据分组透视处理工具
- 带权/种类并查集-POJ 1182食物链
- 浙大版《C语言程序设计(第3版)》题目集 练习10-1 使用递归函数计算1到n之和
- 十分钟快速了解Pandas的常用操作!
- 一行代码如何隐藏 Linux 进程?
- SSH 只能用于远程 Linux 主机?那说明你见识太小了!
- 干货 | Trip.com 机票React Native整洁架构2.0实践
- 干货 | 日均TB级数据,携程支付统一日志框架
- 为什么 HTTPS 是安全的?
- Hello World背后的故事:如何在Linux上编译C语言程序
- 浅谈Linux的动态链接库
- 初识ABP vNext(9):ABP模块化开发-文件管理