插入排序-希尔排序
来源:互联网 发布:淘宝怎么弄到很多小号 编辑:程序博客网 时间:2024/05/16 06:19
Shell排序算法严格来说基于插入排序的思想,其又称为希尔排序或者缩小增量排序。
基本思想:
先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。
排序流程
- 将有N个元素的数组分成n/2个数字序列,第1个数据和第n/2+1个数据为一对
- 一个循环是每一个序列对排好顺序。
- 然后,再变为n/4 个序列,再次排序。
- 不断重复上诉过程,随着序列的减少最后变为一个,也就完成了整个排序。
例如
对于序列 127,118,105,101,112,100
初始:[127, 118, 105, 101, 112, 100]
第1次:[101, 112, 100, 127, 118, 105]
第2次:[100, 101, 105, 112, 118, 127]
执行步骤
- 第1次:首先将数组分为6/2=3个数字序列,第1个数据127和第4个数据101,第2个数据118和第5个数据112位一对,第3个数据和第6个数据为一对。每一对数据进行排序,此时排序后的数据为[101, 112, 100, 127, 118, 105]
- 第2次:将数组分为6/4=1 个序列,此时诸葛对数据比较,按照插入的排序算法对这个序列进行排序,排序后的数据为[100, 101, 105, 112, 118, 127]
示例代码
public class SheelSortDemo { public static void main(String[] args) { int[] a = { 127,118,105,101,112,100}; System.out.println("初始:" + Arrays.toString(a)); sheel(a); } //希尔排序 public static void sheel(int[] a){ int d=a.length; int temp; int count=0; while(d!=1){ d=d/2; for (int i = 0; i < a.length; i++) { for ( int j= i+d; j<a.length;j+=d){ int k=j-d; temp=a[j]; for(;k>=0 && temp < a[k];k-=d){ a[k+d]=a[k]; } a[k+d]=temp; } } System.out.println("第" + ++count + "次:" + Arrays.toString(a)); } }}
0 0
- 插入排序--希尔排序
- 插入排序 希尔排序
- 插入排序--希尔排序
- 插入排序,希尔排序
- 插入排序:希尔排序
- 插入排序-希尔排序
- 插入排序(希尔排序)
- 【插入排序】希尔排序
- 插入排序、希尔排序
- 插入排序,希尔排序
- 插入排序希尔排序
- 插入排序-希尔排序
- 插入排序-希尔排序
- 插入排序&&希尔排序
- 插入排序-希尔排序
- 插入排序,希尔排序
- 插入排序&希尔排序
- 二分插入排序 插入排序 希尔排序
- 哪些情况下sql索引会失效
- nodejs POST加号变成了空格
- null和undefined的区别?
- 作业
- leetcode--Count Primes
- 插入排序-希尔排序
- 性能优化的方法?
- 什么是aar包,和androidstudio 如何添加arr包依赖
- SpringBoot-mybatis- thymeleaf
- 为什么不少程序员极度推崇纯 vim 和 emacs,却对 IDE 嗤之以鼻?(1)
- 不同的数据类型在32位和64位下所占字节的区别
- Word Amalgamation—— 个人c++解
- HDOJ-1024 Max Sum Plus Plus (最大M子段和问题)
- Codeforces 570D Tree Requests【Dfs序+二分】好题!