java 希尔排序

希尔排序(更高效的插入排序)

减少最小数在最后一位的情况下要循环的次数
思路:
把数组按增量(n/2)分组,对每一组使用插入排序去排序交换位置,然后不停地增量/2,直到其为1时,结束

  • 分组:如n/2=5
    891723
    8与3为一组
    从不包含本身的数开始数
  • 两种实现方法:
    交换法(效率较低)
    移动法(效率较高)

交换法

对第一轮排序的分析

public class ShellSort {public static void main(String[] args) {int[] arr = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};System.out.println("排序前---");System.out.println(Arrays.toString(arr));shellSort(arr);}public static void shellSort(int[] arr) {//第一种方式:交换法//10个数据进行了三轮排序//第一轮,将1o个数据分成了5组//遍历每一组,共有5组for (int i = 5; i < arr.length; i++) {//遍历各组中所有的元素(共有5组),每一组有两个元素,步长5//int j = i-5刚好是每一组的第一个元素//j -= 5为了退出当前循环,进行下一组交换for (int j = i - 5; j >= 0; j -= 5) {//如果当前元素大于加上步长后的元素,说明需要交换if (arr[j] > arr[j + 5]) {//交换int temp = arr[j];arr[j] = arr[j + 5];arr[j + 5] = temp;}}}System.out.println("第1轮插入后---");System.out.println(Arrays.toString(arr));}
}

排序过程

排序前---
[8, 9, 1, 7, 2, 3, 5, 4, 6, 0]1轮插入后---
[3, 5, 1, 6, 0, 8, 9, 4, 7, 2]2轮插入后---
[0, 2, 1, 4, 3, 5, 7, 6, 9, 8]3轮插入后---
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

代码实现:

public class ShellSort {public static void main(String[] args) {int[] arr = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};System.out.println("排序前---");System.out.println(Arrays.toString(arr));shellSort(arr);}public static void shellSort(int[] arr) {//第一种方式:交换法//10个数据进行了三轮排序//第一轮,将1o个数据分成了5组//遍历每一组,共有5组//gsp每一次的增量,最后为1int count = 0;for (int gsp = arr.length / 2; gsp > 0; gsp /= 2) {for (int i = gsp; i < arr.length; i++) {//遍历各组中所有的元素(共有5组),每一组有两个元素,步长5//int j = i-5刚好是每一组的第一个元素//j -= 5为了退出当前循环,进行下一组交换for (int j = i - gsp; j >= 0; j -= gsp) {//如果当前元素大于加上步长后的元素,说明需要交换if (arr[j] > arr[j + gsp]) {//交换int temp = arr[j];arr[j] = arr[j + gsp];arr[j + gsp] = temp;}}}System.out.println("第" + (++count) + "轮插入后---");System.out.println(Arrays.toString(arr));}}
}

移动法

交换法效率低是因为发现一个就交换一个

public class ShellSort {public static void main(String[] args) {int[] arr = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};System.out.println("排序前---");System.out.println(Arrays.toString(arr));shellSort2(arr);}public static void shellSort2(int[] arr) {//第二种方法:移动法//使用增量,逐步缩小增量int count = 0;for (int gap=arr.length/2;gap>0;gap/=2){//从第gap个元素开始,逐个对其所在组进行直接插入排序//遍历每一个组for (int i = gap; i < arr.length; i++) {int index=i;//待插入的下标,每个组的第二个元素int value=arr[index];//用临时变量记录要插入的数//找位置arr[index-gap]每个组第一个元素if(arr[index]<arr[index-gap]){while (index-gap>=0&&value<arr[index-gap]){//移动arr[index]=arr[index-gap];index-=gap;}//当退出while就找到了插入的位置arr[index]=value;}}System.out.println("第" + (++count) + "轮插入后---");System.out.println(Arrays.toString(arr));}}}

无注释版

public class TestShellSort {public static void main(String[] args) {int[] arr = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};System.out.println("排序前---");System.out.println(Arrays.toString(arr));shellSort2(arr);}private static void shellSort1(int[] arr) {//交换法for (int gap = arr.length / 2; gap > 0; gap /= 2) {for (int i = gap; i < arr.length; i++) {for (int j = i - gap; j >= 0; j -= gap) {if (arr[j] > arr[j + gap]) {int temp = arr[j];arr[j] = arr[j + gap];arr[j + gap] = temp;}}}}System.out.println("排序后---");System.out.println(Arrays.toString(arr));}private static void shellSort2(int[] arr) {
//移动法for (int gap = arr.length / 2; gap > 0; gap /= 2) {for (int i = gap; i < arr.length; i++) {int index=i;int value=arr[index];if (arr[index]<arr[index-gap]){while (index-gap>=0&&value<arr[index-gap]){arr[index]=arr[index-gap];index-=gap;}arr[index]=value;}}}System.out.println("排序后---");System.out.println(Arrays.toString(arr));}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/446888.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用gtest进行自己的单独测试的代码介绍

命令行 ./bin/hsm_device_apitest --gtest_filter"*aes_test" --device-type rpc --device-socket 192.168.1.108:5000 命令详解 进入工程文件&#xff0c;mkdir build&#xff0c;cd build在build的文件夹下面执行cmake命令和make命令之后&#xff0c;会在build文…

C语言学习:%d、2d、02d、.2d的区别

%d&#xff1a;为普通的输出。 %2d&#xff1a;按宽度为2输出&#xff0c;右对齐方式输出。若不够两位&#xff0c;左边补空格。 %02d&#xff1a;同样宽度为2&#xff0c;右对齐方式。位数不够&#xff0c;左边补0。 %.2d&#xff1a;从执行效果来看&#xff0c;与%02d一样…

计算机系统基础 数据的表示和存储

数制和编码 1.信息的二进制编码 2.进制转换必须要知道: 1)使用哪一个进制(二,八…) 2)定点数还是浮点数(关于小数点的问题) 3)编码问题----原码,补码,反码,移码 3.进制转换 1)R进制转十进制(按权展开) ----R进制 ----八进制与十六进制 ----R转换为十进制 2)十进制转换为R…

C++中vector章节iterator与const_iterator及const iterator区别

C目前倾向于使用迭代器遍历容器中的元素&#xff0c;而不是使用下标访问的方式来访问容器中的元素。可以使用iterator和const_iterator来访问元素&#xff0c;但是const类型的容器&#xff0c;那么只能用const_iterator来遍历。区别在于iterator可以改变元素的数值&#xff0c;…

Android查看当前应用已经加载的so库

源代码&#xff1a; private static List<String> allSOLists new ArrayList<String>();/** * 获取全部已加载的SO库*/private void getAllSOLoaded(){allSOLists.clear();// 当前应用的进程IDint pid Process.myPid();String path "/proc/" pid &q…

Android 进程监控(top命令)

文章目录一、查看top命令Android N&#xff08;7.1系统&#xff0c;level 25&#xff09; 及之前Android O&#xff08;8.0系统&#xff0c;level 26&#xff09; 及之后二、top -n [number]Android N&#xff08;7.1系统&#xff0c;level 25&#xff09; 及之前Android O&…

java 快速排序

快速排序 对冒泡排序的一种改进 思路: 一趟排序后,选取一个中间值,数组被分为比中间值小的部分,比中间值大的部分;再对左右两部分分别递归排序 代码实现 import java.util.Arrays;public class QuickSort {public static void main(String[] args) {int[] arr {-9, 78, 0, 2…

C++字符串的个人理解

String string是字符串&#xff0c;在声明一个字符串的时候&#xff0c;比如string a;这个过程是在栈上进行的&#xff0c;但是如果给这个字符串分配内存空间&#xff0c;这段区间是存储在堆上的&#xff0c;因此最好在声明字符串的时候就要指出字符串的大小和对其进行初始化s…

Android 基础性能数据获取(/proc/)

一、系统内存 读取命令&#xff1a; /proc/meminfoJava代码&#xff1a; private void click(){try{String cmd "/proc/meminfo";BufferedReader reader new BufferedReader(new InputStreamReader(new FileInputStream(cmd)), 1000);StringBuilder sb new Stri…

物理 常见力与牛顿三定律

常用知识点 动量 dmvdmvdvm p-mv- f-dp-/dtma- 开普勒第三定律 r1^3__k只与恒星质量有关 T^2 总结 1.电梯匀速就相当于在地面,加速或减速就会有一个a 2.当合外力为0时,物体保持静止或匀速直线运动 3.力是改变物体运动状态的原因 4.重力在地球两极最大,赤道最小,随纬度…

Java命令:jmap — 打印指定进程的共享对象内存映射或堆内存细节

文章目录一、前言二、命令介绍三、使用实例1、jmap -heap [pid]2、jmap -histo[:live] [pid]3、jmap -histo[:live] [pid] |grep "[关键字1]\|[关键字2]"4、jmap -dump:live,formatb,filea.log [pid]四、总结一、前言 jdk安装后会自带一些小工具&#xff0c;jmap命令…

C++vector相关学习,我的理解

vector的初始化方式 1&#xff0c;使用拷贝初始化时候&#xff0c;即使用的时候&#xff0c;只可以提供一个初始值2&#xff0c;如果提供一个类内初始值&#xff0c;只可以使用拷贝初始化或者使用花括号的方式初始化3&#xff0c;如果提供的是初始元素值的列表&#xff0c;只可…

概率论 一维随机变量

随机变量 离散型随机变量:有限个或无限可列个 连续型随机变量 分布函数F(X) 范围是[a,b) 包含能取到a以及a之前的值的概率相加 分布律(概率分布) 1.所有概率相加为1 2.WX-1,计算出每一个对应的W,然后如果有相同的W就合并其概率,最后一一对应P(x)即可 概率密度函数(密度) …

Linux命令:grep命令详解

grep常用参数说明 grep [OPTIONS] PATTERN [FILE...] grep [OPTIONS] [-e PATTERN]... [-f FILE]... [FILE...]OPTIONS:-e: 使用正则搜索-i: 不区分大小写-v: 查找不包含指定内容的行-w: 按单词搜索-c: 统计匹配到的次数-n: 显示行号-r: 逐层遍历目录查找-A: 显示匹配行及后…

ECC密钥结构和密码学基础

参考链接 密码学基础3&#xff1a;密钥文件格式完全解析ECC数据结构

JAVA牛客专项练习2020.12.31

1.使用迭代器的remove方法&#xff0c;可以边遍历边删除元素 2.线程 启动线程 new thread&#xff08;&#xff09;.start&#xff08;&#xff09; new thread&#xff08;new runnable&#xff08;&#xff09;&#xff09;.start&#xff08;&#xff09; 普通方法&#xf…

Linux命令:find命令详解

find命令格式 find path -option [-print] [-exec -ok |xargs |grep] [command {} \;]# 参数说明path: find命令所查找的目录路径。~ 表示$HOME目录;.来表示当前目录;/来表示系统根目录。-print: find命令将匹配的文件输出到标准输出。-exec: find命令对匹配的文件执行该参数所…

boost::interprocess::named_mutex的翻译和学习

官方地址 named_mutex 简介 // In header: <boost/interprocess/sync/named_mutex.hpp>class named_mutex { public:// construct/copy/destruct 构建/复制/销毁named_mutex(create_only_t, const char *, const permissions & permissions());named_mutex(open_o…

安卓牛客专项练习2020.12.31

1.窗口dialog或半透明 2.Pracelable性能比serializable高

MAC查找JDK的路径

在控制台中输入&#xff1a; /usr/libexec/java_home -V输出如下结果&#xff1a; Matching Java Virtual Machines (4):1.8.0_121, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home1.7.0_79, x86_64: "Java SE 7&quo…