插入排序与希尔排序Java实现
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实现的更多相关文章
- 程序员必知的8大排序(一)-------直接插入排序,希尔排序(java实现)
http://blog.csdn.net/pzhtpf/article/details/7559896 程序员必知的8大排序(一)-------直接插入排序,希尔排序(java实现) 程序员必知的8大 ...
- 牛客网Java刷题知识点之插入排序(直接插入排序和希尔排序)、选择排序(直接选择排序和堆排序)、冒泡排序、快速排序、归并排序和基数排序(博主推荐)
不多说,直接上干货! 插入排序包括直接插入排序.希尔排序. 1.直接插入排序: 如何写成代码: 首先设定插入次数,即循环次数,for(int i=1;i<length;i++),1个数的那次不用 ...
- 希尔排序及希尔排序java代码
原文链接:http://www.orlion.ga/193/ 由上图可看到希尔排序先约定一个间隔(图中是4),然后对0.4.8这个三个位置的数据进行插入排序,然后向右移一位对位置1.5.9进行插入排序 ...
- 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)
本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...
- IOS- 快速排序,冒泡排序,直接插入排序和折半插入排序,希尔排序,堆排序,直接选择排序
/*******************************快速排序 start**********************************///随即取 当前取第一个,首先找到第一个的位置 ...
- Python八大算法的实现,插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、基数排序。
Python八大算法的实现,插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得 ...
- 几种常见排序算法之Java实现(插入排序、希尔排序、冒泡排序、快速排序、选择排序、归并排序)
排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列. 稳定度(稳定性)一个排序算法是稳定的,就是当有两个相等记录的关 ...
- 【算法拾遗(java描写叙述)】--- 插入排序(直接插入排序、希尔排序)
插入排序基本思想 每次将一个待排序的记录按其keyword大小插入到前面已经拍好序的子文件的适当位置,直到全部记录插入完毕为止. 直接插入排序 基本思想 直接插入排序的基本操作是将一个记录插入到已排好 ...
- 冒泡排序 选择排序 插入排序希尔排序 java
双向冒泡 package com.huang; public class _014_bubb_sort { int[] b={1,2}; static int a[]={12,4,35,65,43,6 ...
随机推荐
- C#中的ToString格式大全
// C# 日期格式 DateTime dt = DateTime.Now; dt.ToString();//2005-11-5 13:21:25 dt.ToFileTime().ToString() ...
- Oracle 11g RAC 修改各类IP地址
Oracle 11g RAC 修改各类IP地址 首先,我们都知道Oracle 11g RAC中的IP主要有:Public IP.VIP.SCAN VIP.Private IP这几种. 一般这类改IP地 ...
- 安装oh-my-zsh
目标:安装oh-my-zsh,并使用last-working-dir插件(再次登录时,默认在上次退出时的目录)环境:CentOS 7.3.1611 最好看原著 -> https://github ...
- PocScan的搭建与使用
安装Docker, 然后下载镜像 $ sudo curl -sSL https://get.daocloud.io/docker | sh $ sudo systemctl start docker ...
- MySQL xtrabackup之--databases 勿手贱
xtrabackup备份单库时,必须指定--databases,但是如果将databases写成了database,那么xtrabackup备份的就是整个数据库,以下是 uuid = 397ae42e ...
- [POI2007]洪水pow 并查集
我们先得出一个结论:水泵要建在城市上.因为如果在非城市上建能把其他一些城市抽干,那么在城市上建也是一个效果(自己画图感性理解一下) 然后我们明白抽水的条件:周围的高度要>=自身的高度,这样会抽完 ...
- [js高手之路] vue系列教程 - 实现留言板todolist(3)
通过前面两篇文章的的学习,我们掌握了vue的基本用法. 本文,就利用这些基础知识来实现一个留言板, 老外把他称之为todolist. 第一步.使用bootstrap做好布局 <!DOCTYPE ...
- Linux/Unix监控其他用户和信号
--Linux/Unix监控其他用户和信号 ------------------------------------------------------2013/10/27 查看有哪些用户登录 w ...
- 剑指OFFER——正则表达式匹配
请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式.例如,字 ...
- mysql按某个列执行1-N排名的问题
对所有员工的当前(to_date='9999-01-01')薪水按照salary进行按照1-N的排名,相同salary并列且按照emp_no升序排列CREATE TABLE `salaries` (` ...