public class TestMain {
public static void main(String[] args) {
Integer[] a = new Integer[5000]; for (int i = 0; i < a.length; i++) {
int temp = (int)(StdRandom.random()*10000);
a[i] = temp;
} Integer[] b = new Integer[5000];
for (int i = 0; i < b.length; i++) {
b[i] = a[i];
}
//生成两个相同的随机数组
Stopwatch timer2 = new Stopwatch();
ToSort.insertsort(b);
System.out.println(timer2.elapsedTime());
//比较两种排序运行的时间
Stopwatch timer = new Stopwatch();
ToSort.shellsort(a);
System.out.println(timer.elapsedTime()); }
} class ToSort{
/*
* 插入排序
* 时间复杂度O(N^2) N为数组长度
*/
public static void insertSort(Comparable[] a) {
for (int i = 1; i < a.length; i++) { //从 1项开始,递增项数,将前 i 项进行排序
//int temp = (int) a[i];
int j;
for ( j = i; j > 0 && less(a[j] /*如果改为右移这里则改为 temp*/, a[j-1]); j--) {
//前 i-1 项为已排好序的数组,将第 i 项与 i-1 项比较,比前面的小则交换两项,然后继续比较 i-1 和 i-2
//例子:1,4,8,3 排序后将 3 插入到了 4 前面 1,3,4,8
exch(a, j, j-1); //这里将交换改为右移可以提高速度 a[j] = a[j-1];
}
//a[j] = temp;
}
}
/*
* 希尔排序
*/
public static void shellSort(Comparable[] a) {
int T = a.length;
int h = 1;
while(h<T/3) h = h*3 + 1; //使用 1, 4, 13, 40, 121这个希尔序列
while (h >= 1) { //当 h 为 1 时,其实就是插入排序,但前面的工作可以使整个过程变快
for (int i = h; i < T; i++) { //按当前间隔 h 进行比较,从第一个数开始每隔 h 取一个数,组成数组,进行排序。
for (int j = i; j >= h && less(a[j], a[j-h]) ; j -= h) {
exch(a, j, j-h);
}
}
h = h/3;
}
}
/*
* 判断是否v < w
*/
private static boolean less(Comparable v, Comparable w) {
return v.compareTo(w) < 0; //+1则false,-1则true
}
/*
* 交换a[i]与a[j]的值
*/
private static void exch(Comparable[] a, int i, int j) {
Comparable t = a[i];
a[i] = a[j];
a[j] = t;
}
/*
* 打印出数组
*/
public static void show(Comparable[] a) {
for (Comparable comparable : a) {
System.out.print(comparable+" ");
}
System.out.println();
}
/*
* 判断数组是否有序
*/
public static boolean isSorted(Comparable[] a) {
for (int i = 1; i < a.length; i++) {
if (less(a[i], a[i-1])) return false;
}
return true;
}
}

希尔排序示意图(图片来自《算法(第四版官网)》)

插入排序与希尔排序Java实现的更多相关文章

  1. 程序员必知的8大排序(一)-------直接插入排序,希尔排序(java实现)

    http://blog.csdn.net/pzhtpf/article/details/7559896 程序员必知的8大排序(一)-------直接插入排序,希尔排序(java实现) 程序员必知的8大 ...

  2. 牛客网Java刷题知识点之插入排序(直接插入排序和希尔排序)、选择排序(直接选择排序和堆排序)、冒泡排序、快速排序、归并排序和基数排序(博主推荐)

    不多说,直接上干货! 插入排序包括直接插入排序.希尔排序. 1.直接插入排序: 如何写成代码: 首先设定插入次数,即循环次数,for(int i=1;i<length;i++),1个数的那次不用 ...

  3. 希尔排序及希尔排序java代码

    原文链接:http://www.orlion.ga/193/ 由上图可看到希尔排序先约定一个间隔(图中是4),然后对0.4.8这个三个位置的数据进行插入排序,然后向右移一位对位置1.5.9进行插入排序 ...

  4. 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

    本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...

  5. IOS- 快速排序,冒泡排序,直接插入排序和折半插入排序,希尔排序,堆排序,直接选择排序

    /*******************************快速排序 start**********************************///随即取 当前取第一个,首先找到第一个的位置 ...

  6. Python八大算法的实现,插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、基数排序。

    Python八大算法的实现,插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得 ...

  7. 几种常见排序算法之Java实现(插入排序、希尔排序、冒泡排序、快速排序、选择排序、归并排序)

    排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列. 稳定度(稳定性)一个排序算法是稳定的,就是当有两个相等记录的关 ...

  8. 【算法拾遗(java描写叙述)】--- 插入排序(直接插入排序、希尔排序)

    插入排序基本思想 每次将一个待排序的记录按其keyword大小插入到前面已经拍好序的子文件的适当位置,直到全部记录插入完毕为止. 直接插入排序 基本思想 直接插入排序的基本操作是将一个记录插入到已排好 ...

  9. 冒泡排序 选择排序 插入排序希尔排序 java

    双向冒泡 package com.huang; public class _014_bubb_sort { int[] b={1,2}; static int a[]={12,4,35,65,43,6 ...

随机推荐

  1. JStorm与Storm源码分析(三)--Scheduler,调度器

    Scheduler作为Storm的调度器,负责为Topology分配可用资源. Storm提供了IScheduler接口,用户可以通过实现该接口来自定义Scheduler. 其定义如下: public ...

  2. springMVC 中几种获取request和response的方式

    1.最简单方式:参数 例如: @RequestMapping("/test") @ResponseBody public void saveTest(HttpServletRequ ...

  3. elk 5.x的部署

    前言 elk是由elasticsearch.logstash.kibana三者组成 其中elasticsearch主要负责数据存储与搜索 logstash主要负责收集日志信息以及对日志信息的切片索引等 ...

  4. Grass Cownoisseur[Usaco2015 Jan]

    题目描述 In an effort to better manage the grazing patterns of his cows, Farmer John has installed one-w ...

  5. java亦或(^)

    在java程序里面的异或用法: 相同输出0,不同输出1,例如: System.out.println(1^1); 输出0 System.out.println(1^2):输出3,因为最后2个低位都不一 ...

  6. 头文件string.h里的函数

    .strcpy 函数名: stpcpy 功 能: 拷贝一个字符串到另一个 用 法: char *stpcpy(char *destin, char *source); 程序例: #include &l ...

  7. ffmpeg编解码视频导致噪声增大的一种解决方法

    一.前言 ffmpeg在视音频编解码领域算是一个比较成熟的解决方案了.公司的一款视频编辑软件正是基于ffmpeg做了二次封装,并在此基础上进行音视频的编解码处理.然而,在观察编码后的视频质量时,发现图 ...

  8. 移动端https抓包那些事--进阶篇

    上一次和大家介绍了手机端https抓包的初级篇,即在手机未root或者未越狱的情况下如何抓取https流量,但是当时分析应用时会发现,好多应用的https的流量还是无法抓取到,这是为什么呢? 主要原因 ...

  9. angular学习(一)-- Expression

    1.1 表达式:Expression 在AngularJS中,表达式是一种类似于模板引擎的语法, 可以在书写的位置 "输出" 数据. 基本使用 表达式写在双大括号内:{{ expr ...

  10. .NET定位CPU使用率过高问题

    摘要: 当一个.net应用在生产环境CPU突然居高不下,如何快速准确的定位问题所在,并且对实时业务影响最小化?如何不抓Dump也不用live debug就可以知道你的应用在做什么?如何确认你的应用是由 ...