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.pswp.cn/news/446888.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/446888.shtml
英文地址,請注明出處:http://en.pswp.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…