插入排序->希尔排序
/**
* 插入排序
*/
public class InsertSort {
public static void main(String[] args){
int[] arr = {5,5,2,6,3,4};
int length = arr.length;
int a,b,key;
for (a = 1; a < length; a++) {
key = arr[a];
b = a - 1; //1
while (b>=0&&arr[b]>key){
arr[b+1] = arr[b];
b--;
}
//while不执行arr[b+1]->arr[a]
arr[b+1] = key;
System.out.println();
for (Integer integer : arr) {
System.out.print(integer+" ");
}
}
//5 5 2 6 3 4
//2 5 5 6 3 4
//2 5 5 6 3 4
//2 3 5 5 6 4
//2 3 4 5 5 6
}
}
/**
* 希尔排序
*/
public class ShellSort1 {
public static void main(String[] args) {
int[] arr = {5, 5, 2, 6, 3, 4};
for (Integer integer : arr) {
System.out.print(integer+" ");
}
int h = 1;
while (h <= arr.length / 3) {
h = h * 3 + 1;
}
System.out.println();
System.out.println("h:"+h);
while (h > 0) {
for (int a = h; a < arr.length; a++) {
if (arr[a] < arr[a - h]) {
int tmp = arr[a];
int b = a - h;
while (b >= 0 && arr[b] > tmp) {
arr[b + h] = arr[b];
b -= h;
}
arr[b + h] = tmp;
System.out.println();
for (Integer integer : arr) {
System.out.print(integer+" ");
}
}
}
h = (h - 1) / 3;
System.out.println();
System.out.println("h:"+h);
}
//5 5 2 6 3 4
//h:4
//
//3 5 2 6 5 4
//3 4 2 6 5 5
//h:1
//
//2 3 4 6 5 5
//2 3 4 5 6 5
//2 3 4 5 5 6
//h:0
}
}
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 希尔排序 并行
*/
public class ShellSort{
static int[] arr = {5,5,2,6,3,4};
static ExecutorService pool = Executors.newCachedThreadPool();
public static class ShellSortTask implements Runnable {
int i = 0, h = 0;
CountDownLatch l;
public ShellSortTask(int i, int h, CountDownLatch l) {
this.i = i;
this.h = h;
this.l = l;
}
@Override
public void run() {
if (arr[i]<arr[i -h]){
int tmp = arr[i];
int b = i - h;
while (b>=0 && arr[b]>tmp){
arr[b+h] = arr[b];
b -= h;
}
arr[b+h] = tmp;
System.out.println();
for (Integer integer : arr) {
System.out.print(integer+" ");
}
}
l.countDown();
}
}
public static void pShellSort() throws InterruptedException{
int h = 1;
CountDownLatch latch = null;
while (h<=arr.length/3){
h = h * 3 + 1;
}
while (h>0){
System.out.println("h:"+h);
if (h>=4){
latch = new CountDownLatch(arr.length-h);
}
for (int a = h; a < arr.length; a++) {
if (h >= 4) {
pool.execute(new ShellSortTask(a,h,latch));
} else {
if (arr[a] < arr[a - h]) {
int tmp = arr[a];
int b = a - h;
while (b >= 0 && arr[b] > tmp) {
arr[b + h] = arr[b];
b -= h;
}
arr[b + h] = tmp;
System.out.println();
for (Integer integer : arr) {
System.out.print(integer+" ");
}
}
}
}
latch.await();
h = (h-1)/3;
}
pool.shutdown();
}
public static void main(String[] args) throws InterruptedException{
pShellSort();
}
//h:4
//
//3 5 2 6 5
//3 4 2 6 5 5 5 h:1
//
//2 3 4 6 5 5
//2 3 4 5 6 5
//2 3 4 5 5 6
}
插入排序->希尔排序的更多相关文章
- 学习C#之旅 冒泡排序,选择排序,插入排序,希尔排序[资料收集]
关于冒泡排序,选择排序,插入排序,希尔排序[资料收集] 以下资料来源与网络 冒泡排序:从后到前(或者从前到后)相邻的两个两两进行比较,不满足要求就位置进行交换,一轮下来选择出一个最小(或最大)的放到 ...
- 冒泡排序 & 选择排序 & 插入排序 & 希尔排序 JavaScript 实现
之前用 JavaScript 写过 快速排序 和 归并排序,本文聊聊四个基础排序算法.(本文默认排序结果都是从小到大) 冒泡排序 冒泡排序每次循环结束会将最大的元素 "冒泡" 到最 ...
- 数组排序-冒泡排序-选择排序-插入排序-希尔排序-快速排序-Java实现
这五种排序算法难度依次增加. 冒泡排序: 第一次将数组相邻两个元素依次比较,然后将大的元素往后移,像冒泡一样,最终最大的元素被移到数组的最末尾. 第二次将数组的前n-1个元素取出,然后相邻两个元素依次 ...
- 冒泡排序 选择排序 插入排序希尔排序 java
双向冒泡 package com.huang; public class _014_bubb_sort { int[] b={1,2}; static int a[]={12,4,35,65,43,6 ...
- 内部排序->插入排序->希尔排序
文字描述 希尔排序又称缩小增量排序,也属于插入排序类,但在时间效率上较之前的插入排序有较大的改进. 从之前的直接插入排序的分析得知,时间复杂度为n*n, 有如下两个特点: (1)如果待排序记录本身就是 ...
- 插入排序:直接插入排序&希尔排序
一.直接插入排序 1. 思想 直接排序法, 可以分为两个部分, 一部分是有序的, 一部分是无序的. 从这个图上, 应该是能看清楚直接插入排序的思想了. 将无序部分的第一个与有序部分进行比较. 从有序部 ...
- 插入排序—希尔排序(Shell`s Sort)原理以及Java实现
希尔排序是1959 年由D.L.Shell 提出来的,相对直接排序有较大的改进.希尔排序又叫缩小增量排序 基本思想: 先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录 ...
- 直接插入排序&希尔排序
1.直接插入排序 时间复杂度O(n2) 工作原理: 通过构建有序序列,对于未排序数据,在已排序的序列中,从后向前扫描,找到相应的位置并插入. 插入排序在实现上,在从后向前扫描的过程中,需要反复把已排序 ...
- PHP 插入排序 -- 希尔排序
1.希尔排序 -- Shell Insertion Sort 时间复杂度:数学家正在勤劳的探索! 适用条件: 直接插入排序的改进,主要针对移动次数的减少,这取决于"增量队列"的取值 ...
随机推荐
- 51nod1446 限制价值树
有N个点(N<=40)标记为0,1,2,...N-1,每个点i有个价值val[i],如果val[i]=-1那么这个点被定义为bad,否则如果val[i] >=0那么这个点为定义为good. ...
- ANTLR4将BF翻译成CPP
实验环境: 操作系统:windows 10 JAVA:JDK 1.8 antlr:antlr-4.7.1-complete.jar IDE:IntelliJ IDEA 2017.2.7 实验目的: 实 ...
- NOIP 真题选讲
推荐生要凉辽 这可能是我更新的最后一篇博客 代码什么的有时间再说吧,先讲思路.(已搞定前三题代码) 首先先看一下线段覆盖题.我们有一个区间,要用线段覆盖整个区间. 这个是线段的覆盖简图.我们如何选取最 ...
- springboot参数校验
为了能够进行嵌套验证,必须手动在Item实体的props字段上明确指出这个字段里面的实体也要进行验证.由于@Validated不能用在成员属性(字段)上,但是@Valid能加在成员属性(字段)上,而且 ...
- Convolutional Neural Networks(1): Architecture
Concolutional Neural Networks(CNN)同样使用三层结构,但结构上同Feedforward Neural Network有很大不同,其结构如下图: Input layer: ...
- python学习那点事---pycharm使用弹框问题如何解决
学习python的目标:年后可以找一份不错的维护工作. 2019.11.4日是第一天开始学习python,从开始安装python3.6版本和pycharm开始.安装python版本非常顺利的就完成了, ...
- linux下shell显示git当前分支
function git-branch-name { git symbolic-ref HEAD 2>/dev/null | cut -d"/" -f 3 } functio ...
- activity知识点
一:activity的理解 1.活动:四大应用组件之一 2.作用:提供能让用户操作并与之交互的界面 3.组件的特点: 它的类必须实现特定接口或继承特定类 需要在配置文件中配置全类名 它的对象不是通过n ...
- 【洛谷新手村】简单字符串 p1055 ISBN号码
p1055 ISBN号码[传送门] 算法标签什么的: 思路:直接以字符串的形式读入这一串数字,然后for循环对字符串进行处理,字符串中的数字存进数组中(如果是X,存为10):然后再根据要求判断是否是正 ...
- Codeforces 1105C (DP)
题面 传送门 分析 这种计数问题,要不是纯数学推公式,要不就是dp 先处理出[l,r]中除3余0,1,2的数的个数,记为cnt0,cnt1,cnt2 设\(dp[i][j]\)表示前i个数的和除3余j ...