当前位置: 首页 > news >正文

我叫:希尔排序【JAVA】

1.我兄弟存在的问题

2.毛遂自荐 

希尔排序提希尔(Donald Shell)于1959年提出的一种排序算法。

希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法

希尔排序是基于插入排序的以下两点性质而提出改进方法的:

  • 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;
  • 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位;

3.了解一下我的思想 

先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序

 

4.交换法之详细分步 

public static void shellSort(int[] array) {//第一轮10/2=5,分5组for (int i = 5; i < array.length; i++) {for (int j = i - 5; j >= 0; j -= 5) {if (array[j] > array[j + 5]) {int temp = array[j];array[j] = array[j + 5];array[j + 5] = temp;}}}System.out.println("一轮后:" + Arrays.toString(array));//第二轮 5/2=2.分两组for (int i = 2; i < array.length; i++) {for (int j = i - 2; j >= 0; j -= 2) {if (array[j] > array[j + 2]) {int temp = array[j];array[j] = array[j + 2];array[j + 2] = temp;}}}System.out.println("二轮后:" + Arrays.toString(array));//第三轮 2/2=1.分一组for (int i=1;i< array.length;i++){for (int j=i-1;j>=0;j-=1){if (array[j]>array[j+1]){int temp=array[j];array[j]=array[j+1];array[j+1]=temp;}}}System.out.println("一轮后:"+Arrays.toString(array));}}

5.验证一下 

        int[] array = new int[]{8, 9, 1, 7, 2, 3, 5, 4, 6, 0};shellSort(array);

6.交换法之归一   

  public static void shellSort(int[] array) {for (int gap = array.length / 2; gap > 0; gap /= 2) {//gap分组//分组:共有array.length / 2 组for (int i = gap; i < array.length; i++) {//冒泡比较for (int j = i - gap; j >= 0; j -= gap) {//gap步长//比较if (array[j] > array[j + gap]) {int temp = array[j];array[j] = array[j + gap];array[j + gap] = temp;}}}}}

7. 令人惊叹的移位法

 public static void shellSort(int[] array) {for (int gap = array.length / 2; gap > 0; gap /= 2) {//从第gap个元素开始逐个对其所在的组进行直接插入for (int i = gap; i < array.length; i++) {int j = i;int temp = array[j];if (array[j] < array[j - gap]) {while (j - gap >= 0 && temp < array[j - gap]) {//开始移动,而非交换array[j] = array[j - gap];j -= gap;}//退出while即找到位置array[j] = temp;}}}}

8.看一下的时间 

        int[] arr = new int[80000];for (int i = 0; i < arr.length; i++) {arr[i] = (int) (Math.random() * 8000000);}long start = System.currentTimeMillis();shellSort(arr);long end = System.currentTimeMillis();System.out.println("共需:" + (end - start) + "毫秒");

 共需:12毫秒!!!!注意是80w数据啊!!!!amazing~~~~~~~ 

 

相关文章:

  • 大数据-之LibrA数据库系统告警处理(ALM-37005 GTM进程异常)
  • 【实践】Deployer 发布到search head : local OR default
  • 如何将本地websocket发布至公网并实现远程访问?
  • C练习题_3
  • Python 测试框架 Pytest 的入门
  • Android修行手册-ViewPager定制页面切换以及实现原理剖析
  • Linux - 系统调用(syscall)
  • opencv- CLAHE 有限对比适应性直方图均衡化
  • 【LeetCode二叉树进阶题目】606. 根据二叉树创建字符串,102. 二叉树的层序遍历,107. 二叉树的层序遍历 II
  • docker network容器网络通信
  • Arrays类讲解
  • 使用bard分析视频内容
  • 3、点亮一个LED
  • Redis的性能,哨兵模式,集群,
  • Selenium 4.11 正式发布--再也不用手动更新chrome driver 了
  • Brief introduction of how to 'Call, Apply and Bind'
  • Redux系列x:源码分析
  • Ruby 2.x 源代码分析:扩展 概述
  • Solarized Scheme
  • springMvc学习笔记(2)
  • Zsh 开发指南(第十四篇 文件读写)
  • 大型网站性能监测、分析与优化常见问题QA
  • 汉诺塔算法
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 前端_面试
  • 软件开发学习的5大技巧,你知道吗?
  • 新手搭建网站的主要流程
  • 用 Swift 编写面向协议的视图
  • Java总结 - String - 这篇请使劲喷我
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • $GOPATH/go.mod exists but should not goland
  • (0)Nginx 功能特性
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (2)nginx 安装、启停
  • (4) PIVOT 和 UPIVOT 的使用
  • (4)事件处理——(7)简单事件(Simple events)
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (差分)胡桃爱原石
  • (第27天)Oracle 数据泵转换分区表
  • (二)linux使用docker容器运行mysql
  • (二)WCF的Binding模型
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (四)汇编语言——简单程序
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (一)appium-desktop定位元素原理
  • (转)socket Aio demo
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NET6实现破解Modbus poll点表配置文件
  • .NetCore项目nginx发布
  • /boot 内存空间不够
  • [C\C++]读入优化【技巧】