在学习算法的过程中,我们难免会接触很多和排序相关的算法。总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的。

从今天开始,我们将要进行基本的排序算法的讲解。Are you ready?Let‘s go~~~

1、排序算法的基本概念的讲解

时间复杂度:需要排序的的关键字的比较次数和相应的移动的次数。

空间复杂度:分析需要多少辅助的内存。

稳定性:如果记录两个关键字的A和B它们的值相等,经过排序后它们相对的位置没有发生交换,那么我们称这个排序算法是稳定的。

否则我们称这个排序算法是不稳定的。

排序算法的常见分类:

1、内部排序(最常见的一种排序方式,不需要借助第三方辅助存储工具)

2、外部排序(需要借助外部存储来辅助完成相关的排序操作)

如果参与排序的数据元素非常的多,数据量非常的大,计算机无法把整个排序过程放到内存中进行的话,

我们必须借助外部存储器如磁盘来完成,这种排序方式,我们称之为外部排序。

其中外部排序最常见的就是多路归并排序,即将原始文件分解成多个能够一次性装入内存的部分,分别把每一部分调入

内存完成相应的排序,接下来在对多个有序的外部文件进行多路归并排序。

对于我们绝大多数的程序员而言,我们经常遇到的为内部排序。接下来我们将要对常见的内部排序进行相应的讲解。

今天要讲解的内部排序为:

Shell排序

  1.Shell排序的基本概念的讲解

   希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排
   序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。
   希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词
   越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插
入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量

=1(

<

…<d2<d1),即所有记录放在同一组中进行

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

  2.Shell排序的Java代码实现

    

package com.yonyou.test;/*** 内部排序算法之Shell排序* 默认按照从小到大进行排序操作* @author 小浩* @创建日期 2015-3-27*/
public class Test{public static void main(String[] args) {//需要进行排序的数组int[] array=new int[]{8,3,2,1,7,4,6,5};//输出原数组的内容printResult(array);//shell排序操作shellSort(array);//输出排序后的相关结果printResult(array);}/*** shell排序算法* 增量h=(h*3)+1; 这个增量公式是由Knuth给出的* 如果不是很了解的话请百度一下吧* @param array*/private static void shellSort(int[] array) {//首先根据数组的长度确定增量的最大值int h=1;// 按h * 3 + 1得到增量序列的最大值while(h <= array.length / 3){h = h * 3 + 1;}//进行增量查找和排序while(h>0){         for(int i=h;i<array.length;i++){for(int k=i;k<array.length;k+=h){//判断是否需要重新排序,如果小于k-h处的值,需要重新排序if(array[k]<array[k-h]){int tempValue=array[k];int j=k;for(;j>=i&&tempValue<array[j-h];j-=h){array[j]=array[j-h];}array[j]=tempValue;}}printResult(array);}h=(h-1)/3;} }/***                                        * 输出相应数组的结果* @param array*/private static void printResult(int[] array) {for(int value:array)     System.out.print(" "+value+" ");System.out.println();}/*** 交换数组中两个变量的值* @param array* @param i* @param j*/private static void swap(int[] array,int i,int j){int temp=array[i];array[i]=array[j];array[j]=temp;}
}

  

     

Java常见排序算法之Shell排序相关推荐

  1. 排序算法之shell排序

    关于shell排序算法的介绍参见: ​​​​​​图解排序算法(二)之希尔排序 - dreamcatcher-cx - 博客园 书中3.5节中关于shell排序的实现如下: void shellsort ...

  2. 排序算法 | 希尔shell排序,算法的图解、实现、复杂度和稳定性分析

    希尔shell排序 1.希尔排序--定义 2.希尔排序--步骤描述 3.希尔排序--算法实现 4.希尔排序--复杂度.稳定性分析 1.希尔排序--定义 希尔排序按其设计者希尔(Donald Shell ...

  3. Java排序算法之——希尔排序

    算法简述 希尔排序也叫作shell排序或缩小增量排序,据说是一个叫D.L.Shell的人发明出来的,顾取名shell排序.这种排序是基于插入排序思想的,也比较适用于数据量大时. 我刚开始看到时候对于插 ...

  4. JAVA排序算法之希尔排序

    基本介绍 希尔排序是希尔(Donald Shell)于 1959 年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序. 希尔排序法基本思 ...

  5. java排序算法 sort_Java排序算法之SleepSort排序示例

    本文实例讲述了Java排序算法之SleepSort排序.分享给大家供大家参考,具体如下: 分享一个很有创意的排序算法:sleepSort .巧妙利用了线程的sleep(),代码如下: public c ...

  6. 排序算法之希尔排序(Java实现)

    希尔排序介绍 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序. 希尔排序基本思想 ...

  7. Java经典排序算法:选择排序,动图演示排序过程

    Java经典排序算法:选择排序,动图演示排序过程 示意动图: public class Main {public static void main(String[] args) {new Main() ...

  8. 常见排序算法之希尔排序

    文章目录 1.概述 2.希尔排序之交换法 3.希尔排序之移动法 4.测试案例 1.概述 由于简单的插入排序每次数据量变多的时候,数据需要移动且交换数据的次数也会变多,继而影响效率.希尔排序就是在这个基 ...

  9. 排序---初级排序算法(选择排序、插入排序和希尔排序)

    写在前面的话: 一枚自学Java和算法的工科妹子. 算法学习书目:算法(第四版) Robert Sedgewick 算法视频教程:Coursera  Algorithms Part1&2 本文 ...

最新文章

  1. oracle自动备份
  2. 在CentOS 6.9 x86_64的nginx 1.12.2上开启ngx_http_empty_gif_module模块实录
  3. 算法---------简化路径(Java版本)
  4. 蓝牙nrf52832的架构
  5. OpenCASCADE:使用 XSTEPDRAW
  6. 电脑动态壁纸_每日壁纸—水彩插画少女动漫手机高清无水印壁纸第二波
  7. mysql配置 | 快速上手Linux玩转典型应用
  8. sql server2008导入文本文件
  9. 英制BSW 美制UNC 螺牙的理解
  10. 2022年云南最新消防设施操作员模拟试题题库及答案
  11. redis setex和set 的区别
  12. mysql中char是什么意思_mysql中char与varchar的区别
  13. 计算机处理器采用多核,电脑处理器多核心与高主频哪个更重要【详细介绍】
  14. 国标28181:什么是RTP协议与RTCP协议
  15. 第一条台电子计算机,第一台计算机
  16. UnityC#字串如何获取换行符号-最基础的字串处理方法,也最容易常见错误
  17. AVPro Video 插件在unity中动态播放视频
  18. git 进阶系列教程-------git使用流程
  19. Django基础概念和MVT架构(一)
  20. RedHat RHEL7.2 系统安装详细步骤

热门文章

  1. USACO-Section2.2 Runaround Numbers
  2. Python zipfile模块(压缩解压zip)
  3. JS 原型对象(prototype)
  4. golang map使用总结
  5. Win10 JAVA安装及环境搭建(windows jdk,windows java环境配置)
  6. Linux下9个有用的touch命令示例
  7. 16. OD-破解序列号验证机算法
  8. Java并发编程:volatile关键字解析(转载)
  9. 虚拟环境安装Scrapy框架
  10. 【2017-05-19】WebForm复合控件、用DropDownList实现时间日期选择。