插入排序和Shell排序
- 本文为自己的学习笔记,如果有语义错误请及时指正谢谢,
插入排序
- 插入排序是对未排序数据在有序数据中找位置插入的过程,如下图
排序流程
- 首先对前两个数据进行比较大小,然后确定这两个元素的顺序
- 然后将未排序的第三个元素与之前的两个数据对比,在排好序的两个数据中找到正确位置插入
- 然后就是将第四个数据与之前的排好序的三个数据对比,寻找正确位置插入
- 依照规律完成即可
代码分析
- 首先肯定是要有一个循环来代表整体的数据后移
- 然后还需要一个循环是需要判断未排序元素在已经排好序的数据序列中的正确位置
java实现代码
private static void cr(int[] arrs) {int j;for (int i = 1; i < arrs.length; i++) {j = i;while (j > 0 && arrs[j] < arrs[j-1]){ //一直判断,寻找在有序序列中的正确位置swap(arrs,j,j-1); //数据位置互相交换的内置方法,可以利用tmp变量代替j--;}}System.out.println(Arrays.toString(arrs)); }
Shell排序(希尔排序)
- Shell的思想是利用跳跃步数,也就是固定间隔,比较固定间隔的两个数,然后作交换,在一步步的缩小固定间隔,当固定间隔等于1的时候,数据就保持了一个基本有序的状态了,这个时排序的方法就跟插入排序差不多了,之后完成插入排序可以完成整个过程,思想也类似在插入排序上加入了跳跃步数的概念
排序流程
- len=6,那么他的步数的固定间隔就是len/2 = 6 / 2 = 3,所以999下标为0与下标为3的对应,然后其他数据依次对应
- 然后比较对应数据,如果小即交换
- 交换完成后,就完成了第一次排序,这时候将固定间隔调小,即再次 除以2,之前的步数间隔为3,缩小后为3/2=1,这时候代表了数据已经达到了一个基本有序,所以现在步数间隔为1,所以就是相邻的两个数字做比较交换,过程就跟插入排序类似了
- 如果在缩小间隔过程中,缩小后的步数间隔不为1,那么就继续比较交换对应下标上的数据,直到缩小后间隔为1即开始插入排序
代码分析
- 首先肯定要确定一个步数间隔,那么就是len /2,这也是循环的初始条件,由于间隔是不断缩减的,所以循环还需要改变一个间隔变量,因为缩减,所以这个循环中的循环变量必须保证自身要 > 0
- 上一个循环确定了len/2之后的下标增长规律后即步数间隔,那么与len/2之后的数据对应的len/2之前的数据就是len/2后的数据的下标减去间隔,然后len/2变量不断++,也就可以分别对应上len/2之前的数据
- 找到了对应数据,那么就需要用进行比较交换了
java代码实现
private static void shell(int[] a) {int n = a.length;//确定间隔for (int gap = n / 2; gap > 0; gap /= 2)//len/2之后的递增1//i就是len/2之后的元素下标for (int i = gap; i < n; i++)//j:len/2后面元素对应len/2之前元素的下标for (int j = i - gap; j >= 0 && a[j] > a[j + gap]; j -= gap)swap(a,j,j+gap);System.out.println(Arrays.toString(a)); }
另一种实现方式
private static void shell(int[] arrs) {int tmp;for (int gap = arrs.length / 2 ; gap > 0; gap /= 2) {for (int i = gap; i < arrs.length; i++) {tmp = i;while (tmp - gap > 0 && arrs[tmp] < arrs[tmp - gap]){swap(arrs,tmp,tmp-gap);tmp -= gap;}}}System.out.println(Arrays.toString(arrs)); }
- 如果看不懂一种实现方式也不要紧,代码的实现方式是多种多样的,你可以在参考一下其他人的帖子
参考帖子
插入排序和Shell排序相关推荐
- 七内部排序算法汇总(插入排序、Shell排序、冒泡排序、请选择类别、、高速分拣合并排序、堆排序)...
写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的随意序列,又一次排列成一个按keyword有序的序列.因此排序掌握各种排序算法很重要. 对以下介绍的各个排序,我们假定全部排 ...
- 排序算法的实现。用C语言编程实现冒泡排序、选择排序、插入排序、shell排序、快速排序、堆排序算法、归并排序。利用随机函数产生N个随机整数(10000以上)。
#include<stdio.h> #include <time.h> #include<stdlib.h> #define N 10000 double T, T ...
- C++shell排序(附完整源码)
C++shell排序 shell排序 shell排序代码 性能 shell排序 shell排序在不相邻的元素之间比较和交换.利用了插入排序的最佳时间代价特性,它试图将待排序序列变成基本有序的,然后再用 ...
- 【八大排序】Shell排序
目录 前言 一.分组规则 二.代码实现 总结 前言 本文将介绍八大排序之一,Shell排序,Shell排序实际为直接插入排序的优化,使其时间复杂度降低. "shell排序,又名希尔排序,被称 ...
- C--排序算法:shell排序、快速排序
1.shell排序 Shell排序是这样来分组并排序的:将序列分成子序列,然后分别对子序列进行排序,最后将子序列组合起来.Shell排序将数组元素分成"虚拟"子序列,每个子序列用插 ...
- Shell排序(改良的插入排序)
Shell排序算法最初是由D.L Shell于1959年提出,假设要排序的元素有n个,则每个进行插入排序是并不是所偶的元素同时进行,而是去一段间隔. Shell首先将间隔设定为n/2,然后跳跃的进行插 ...
- 直接插入排序、希尔排序
直接插入排序.希尔排序 一.直接插入排序 (1)主要思想 (2)代码实现 (3)性能分析 二.希尔排序 (1)主要思想 (2)代码实现 (3)性能分析 一.直接插入排序 直接插入排序类似于我们平时玩扑 ...
- 排序---初级排序算法(选择排序、插入排序和希尔排序)
写在前面的话: 一枚自学Java和算法的工科妹子. 算法学习书目:算法(第四版) Robert Sedgewick 算法视频教程:Coursera Algorithms Part1&2 本文 ...
- [4] 算法之路 - 插入排序之Shell间隔与Sedgewick间隔
题目 插入排序法由未排序的后半部前端取出一个值.插入已排序前半部的适当位置.概念简单但速度不快. 排序要加快的基本原则之中的一个: 是让后一次的排序进行时,尽量利用前一次排序后的结果,以加快排序的速度 ...
最新文章
- python实现单例_Python 实现单例模式
- CSU 1325: A very hard problem 中南月赛的一道题。
- subprocess 模块
- 用TortoiseSVN忽略文件或文件夹(ignore)(网络摘抄记录)
- How to expand Azure VM OS Disk
- multisim 12.0安装教程
- 《快活帮》第三次作业:团队项目的原型设计
- 为什么要打jar_为什么海带要打一个结?
- python读取图片路径f.read()转化为bytes类型
- OpenCV.js 快速入门指南
- VSCode安装LeetCode插件
- 如何快速设计一款万能遥控器产品原型(SoC免开发)
- java烟花代码详细步骤,一文说清!
- mysql用拼音显示字段名_MySQL汉字字段按拼音排序显示
- APS系统在注塑行业的应用
- python练习题5:货币转换 I
- 触摸芯片电路布局和走线设计注意事项
- 如何批量用扫描仪扫描照片_如何用手机扫描旧照片
- js 全屏与退出全屏
- Java base64加密解密 两种实现方式