學習插入排序+希爾排序并使用java寫代碼

目錄

  • 插入排序
    • 例子
    • 時間復雜度
    • java代碼
  • 希爾排序(縮小增量排序)
    • 例子
    • 時間復雜度
    • java代碼

相關文章

  • 學習數據結構理論+算法時間復雜度
  • 學習有序二叉樹+平衡二叉樹+紅黑樹
  • 學習冒泡排序+選擇排序并使用java寫代碼
  • 學習插入排序+希爾排序并使用java寫代碼
  • 學習堆排序+基數排序并使用java寫代碼
  • 學習遞歸+歸并排序+快速排序并使用java寫代碼

插入排序:

  1. 認為數組當中的第一個數值是已經排好序的數值;
  2. 定義一個游標,從第二個數值開始不斷地向后進行遍歷;
  3. 游標指向的數值插入到已經拍好序的數組當中。

例子:

  1. 定義一個游標 i ,從第一個開始遍歷;
  2. 定義一個游標 j ,指向 i 的前一個數值;
  3. 對應的 j+1 指向要插入的數值;
  4. j 應當要比 j+1 小,如果 j > j+1 ,交換位置。

待排序組:5、7、4、1、3、0、2、6,用插入排序進行排序,步驟如下:
插入排序開始

  • j 指向5,j+1 指向7,5<7,不動;
    5、7
  • 繼續,i, j,j+1 后移,
    • j 指向7,j+1 指向4,7>4,交換位置;
    • j 指向5,j+1 指向4,5>4,交換位置;
      7、4換位置
      5、4換位置
  • 繼續,i, j,j+1 后移,
    • j 指向7,j+1 指向1,7>2,交換位置;
    • j 指向5,j+1 指向1,5>1,交換位置;
    • j 指向4,j+1 指向1,4>1,交換位置;
      7、1換位置
      5、1換位置
      4、1換位置
  • 繼續,i, j,j+1 后移,
    • j 指向7,j+1 指向3,7>3,交換位置;
    • j 指向5,j+1 指向3,5>3,交換位置;
    • j 指向4,j+1 指向3,4>3,交換位置;
    • j 指向1,j+1 指向3,1<3,不動;
      連續換位置
  • ……
  • 這樣一直交換插入,直到插入排序完成。
    插入排序完成

時間復雜度:

數據(默認從第二個數據開始)移動次數(理想情況沒有中斷)
下標是1的數據1
下標是2的數據2
下標是3的數據3
下表是4的數據4
…………
下標的x-1的數據x-1

等差數列求和公式:y=(1+x?1)(x?1)2y=\frac{(1+x-1)(x-1)}{2}y=2(1+x?1)(x?1)?
得到時間復雜度是:O(n2)O(n^2)O(n2)
缺點: 越小的數值在后面移動的次數越多

java代碼:

package com.xxx;import java.util.Arrays;//插入排序
public class InsertSort {public static void main(String[] args) {int[] arr = {5,7,4,1,3,0,2,6};sort(arr);System.out.println(Arrays.toString(arr));}public static void sort(int[] arr) {for(int i=1;i<arr.length;i++) {//i指向的數據插入到前邊已經拍好的數組當中for(int j=i-1;j>=0;j--) {//j 和 j+1 指向的數據進行比較,交換if(arr[j]>arr[j+1]) {int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}else {break;}}}}
}

插入:
定義游標j指向i的前一個數據,j和j+1指向的數據進行交換,若j+1的值小,則j和j+1指向的值進行交換,j–;繼續比較,知道j+1的值大,或著j=0停止。

希爾排序(縮小增量排序):

  1. 將數組按照數組長度的一半為間隔(步長)進行分組(奇偶無所謂,第一組為3個,剩下的均是兩兩一組),組內進行插入排序
  2. 將數組按照數組長度的一半的一半為間隔進行分組,組內進行插入排序,多個分組來回交替插入排序;
  3. 將數組按照數組長度的一半的一半的一半為間隔進行分組,組內進行插入排序;
  4. ……
  5. 直到步長為1,整個數組作為一組,進行插入配許,結束。

例子:

待排序組:5、7、4、1、3、0、2、6,用希爾排序進行排序,步驟如下:

  1. 先分組:8個數值,8/2=4,每隔四個為一組;
    分組
  2. 組內比較,排序:
    • 5、0比較,交換位置;
    • 7、3比較,交換位置;
    • 4、1比較,交換位置;
    • 2、6比較,位置不動;
      組內比較
  3. 在分一半,步長為2;
    二次分組
  4. 組內比較,排序(分組來回交替排序插入):
    • 0、1比較,位置不動;
    • 3、2比較,交換位置;
    • 1、5比較,位置不動;
    • 2、7比較,位置不動;
    • 5、4比較,交換位置;
    • 7、6比較,交換位置;
      組內再次比較
  5. 在分一半,步長為1,整個數組為一組;
    三次分組
  6. 比較排序,直到結束,希爾排序完成。
    希爾排序完成

時間復雜度:

輪數間隔交換次數
第一輪x/2=x/21x/2=x/2^1x/2=x/21x/2x/2x/2
第二輪x/2/2=x/22x/2/2=x/2^2x/2/2=x/22x/2x/2x/2 ~ x?1x-1x?1
第三輪x/2/2/2=x/23x/2/2/2=x/2^3x/2/2/2=x/23x/2x/2x/2 ~ x?1x-1x?1
第四輪x/2/2/2/2=x/24x/2/2/2/2=x/2^4x/2/2/2/2=x/24x/2x/2x/2 ~ x?1x-1x?1
………………
第k輪1=x/2k1=x/2^k1=x/2kx?1x-1x?1

得到關系式:1=x/2k1=x/2^k1=x/2k
轉換:x=2kx=2^kx=2k
得到一個輪次的k與x的關系式是:k=logxk=logxk=logx
所有的輪次相加是:k=xlogxk=xlogxk=xlogx
得到時間復雜度是:O(nlogn)O(nlogn)O(nlogn)

java代碼:

package com.xxx;import java.util.Arrays;//希爾排序
public class ShellSort {public static void main(String[] args) {int[] arr = {17,7,24,33,28,19,15,30};sort(arr);System.out.println(Arrays.toString(arr));}public static void sort(int[] arr) {//定義步長變量 grpfor(int grp=arr.length/2;grp>=1;grp=grp/2) {//定義游標 i,控制 i 的移動,組內進行插入排序for(int i=grp;i<arr.length;i++) {//結束 j 和 j+grp 完成組內的插入for(int j=i-grp;j>=0;j=j-grp) {// j 和 j+grp 指向的數據進行比較,交換if(arr[j]>arr[j+grp]) {int temp = arr[j];arr[j] = arr[j+grp];arr[j+grp] = temp;}else {break;}}}}}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/95445.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/95445.shtml
英文地址,請注明出處:http://en.pswp.cn/web/95445.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

win10虛擬機報錯打不開和ubuntu空間不足

ubuntu主機安裝的win10虛擬機報錯如下&#xff0c;導致虛擬機無法打開解決辦法 如上圖&#xff0c;找到ubuntu主機home目錄中win10的路徑&#xff0c;將紅色框的文件刪除&#xff0c;然后將綠色框中的文件.prev后綴去掉&#xff0c;如下圖所示。重新打開虛擬機就可以了 ubuntu空…

指紋手機技術:破解亞馬遜多賬號運營痛點的底層邏輯與實踐

在亞馬遜平臺運營中&#xff0c;賬號關聯、行為異常、網絡不合規是賣家繞不開的三大核心風險。隨著亞馬遜反作弊系統&#xff08;如 A9 算法&#xff09;對設備指紋、操作軌跡、網絡特征的識別精度持續提升&#xff0c;傳統 “普通手機 VPN” 的多賬號運營模式已頻繁觸發風控&…

《UE5_C++多人TPS完整教程》學習筆記46 ——《P47 蹲伏行走(Crouching Walking)》

本文為B站系列教學視頻 《UE5_C多人TPS完整教程》 —— 《P47 蹲伏行走&#xff08;Crouching Walking&#xff09;》 的學習筆記&#xff0c;該系列教學視頻為計算機工程師、程序員、游戲開發者、作家&#xff08;Engineer, Programmer, Game Developer, Author&#xff09; S…

TiDB v8.5.3 單機集群部署指南

前言 最近在做 TiDB 的恢復演練&#xff0c;需要在單臺 Linux 服務器上部署一套 TiDB 最小的完整拓撲的集群&#xff0c;本文記錄一下安裝過程。 環境準備 開始部署 TiDB 集群前&#xff0c;準備一臺部署主機&#xff0c;確保其軟件滿足需求&#xff1a; 推薦安裝 CentOS 7…

ClickHouse常見問題——ClickHouseKeeper配置listen_host后不生效

ClickHouseKeeper配置listen_host后不生效ClickHouseKeeper配置listen_host后不生效ClickHouseKeeper配置listen_host后不生效 3節點部署ClickHouse集群后&#xff0c;ClickHouse Server執行報錯&#xff1a; Poco::Exception. Code: 1000, e.code() 111, Connection refuse…

《Python × MongoDB 實戰指南:從連接到查詢,構建高效數據操作流程》

《Python MongoDB 實戰指南:從連接到查詢,構建高效數據操作流程》 一、引言:當 Python 遇上 MongoDB 在當今數據驅動的開發世界里,MongoDB 以其靈活的文檔結構、強大的查詢能力和良好的擴展性,成為 NoSQL 數據庫中的佼佼者。而 Python,作為一門簡潔優雅、生態豐富的編…

【Flask + Vue3 前后端分離管理系統】

Flask Vue3 前后端分離管理系統 項目概述 本項目是一個基于 Flask 后端和 Vue3 前端的前后端分離管理系統。項目實現了用戶管理、角色管理、菜單管理、權限控制等完整的后臺管理功能。 技術棧 后端技術棧&#xff1a; Flask 3.0.0 - Python Web框架Flask-SQLAlchemy 3.1.1 - O…

51c視覺~3D~合集5

自己的原文哦~ https://blog.51cto.com/whaosoft/14165531 #AnimateAnyMesh 文本驅動通用網格動畫新范式&#xff0c;實現高效高質量4D內容生成 4D 內容生成&#xff0c;即包含時間維度信息的 3D 內容創建&#xff0c;在 VR/AR、游戲等領域具有廣闊的應用前景。…

開悟篇Docker從零到實戰一篇文章搞定

目錄 一:概述 1:why docker 2:Docker是什么? 3:Docker核心概念 二:初步體驗 1:Docker核心架構圖 2:準備工作 1:服務器 2:Docker安裝 3:阿里云docker安裝 4:鏡像加速 三:Docker命令和幫助文檔的使用 1:幫助文檔 2:鏡像的基本操作 1:查看本地…

LINUX驅動篇(二)驅動開發

系列文章目錄 文章目錄系列文章目錄總結介紹字符設備驅動工作原理驅動框架加載卸載注冊注銷設備號詳解打開關閉等操作實例分析led驅動編寫地址映射LED驅動改進驅動方式總結自動注冊注銷設備號自動創建設備節點設備樹設備樹LED驅動實驗pinctrl和gpio并發和競爭原子操作自旋鎖塊設…

【工具】開源大屏設計器 自用整理

【工具】開源大屏設計器 自用整理 GoView低代碼數據可視化 GoView 說明文檔 | 低代碼數據可視化開發平臺 JimuReport積木報表(免費報表工具) https://github.com/jeecgboot/JimuReport 「數據可視化&#xff1a;報表、大屏、數據看板」積木報表是一款類Excel操作風格&#xf…

.NetCore MVC

這個是我自己記得筆記&#xff0c;最好有點基礎看我的。 html 輔助標簽 Html.DropList 分布視圖 使用 RenderPartialAsync 呈現分部視圖。 此方法不返回 IHtmlContent。 它將呈現的輸出直接流式傳輸到響應。 因為該方法不返回結果&#xff0c;所以必須在 Razor 代碼塊內調用它…

@GitLab 介紹部署使用詳細指南

文章目錄**GitLab 介紹&部署&使用詳細指南****1. GitLab 介紹與核心概念****1.1 什么是 GitLab&#xff1f;****1.2 核心特性****1.3 版本區別****2. 部署指南 (以 Ubuntu 22.04 LTS 為例)****2.1 環境準備****2.2 安裝步驟****2.3 重要配置文件****3. 基本使用入門***…

如何通過 AI IDE 集成開發工具快速生成簡易留言板系統

在當今快速迭代的軟件開發環境中&#xff0c;AI 輔助編程工具已經成為開發者提高效率的重要手段。本文將詳細介紹如何利用 AI IDE 集成開發工具快速構建一個功能完整的簡易留言板系統&#xff0c;涵蓋從需求分析到部署上線的全過程&#xff0c;并提供完整代碼、流程圖、Prompt …

機器學習:從技術原理到實踐應用的深度解析

目錄引言一.什么是機器學習&#xff08;ML&#xff09;&#xff1f;——從技術本質到核心目標1.與傳統編程的本質區別&#xff1a;規則的“來源不同”2.核心目標&#xff1a;在“偏差-方差權衡”下優化性能指標二.機器學習的核心分類——基于“數據標簽”與“學習范式”的技術劃…

[muduo網絡庫]-muduo庫TcpServer類解析

本貼用于記錄muduo庫的學習過程&#xff0c;以下是關于TcpServer的個人理解。 TcpServer內含Acceptor、threadpool等類&#xff0c;算是把主線程所有要做的事封裝了起來。 重要成員變量 EventLoop *loop_; // baseloop 用戶自定義的loopconst std::string ipPort_;const std…

工作兩年,最后從css轉向tailwind了!

菜鳥上班已經兩年了&#xff0c;從一個對技術充滿熱情的小伙子&#xff0c;變成了一個職場老鳥了。自以為自己在不停的學習&#xff0c;但是其實就是學一些零碎的知識點&#xff0c;比如&#xff1a;vue中什么東西沒見過、js什么特性沒用過、css新出了個啥 …… 菜鳥感覺自己也…

macOS 更新后找不到鑰匙串訪問工具的解決方案

macOS 更新后找不到鑰匙串訪問工具的解決方案 隨著macOS的不斷更新&#xff0c;一些系統工具的位置可能會發生變化&#xff0c;給用戶帶來不便。鑰匙串訪問&#xff08;Keychain Access&#xff09;是macOS中一個非常重要的工具&#xff0c;用于管理密碼、證書等敏感信息。最近…

深入理解Go 與 PHP 在參數傳遞上的核心區別

$run_return_data []; $ret $this->handleData($event_req_info, $run_return_data); public function handleData($event_req_info, &$run_return_data): array {$run_return_data [ //使用引用變量返回數據shop_id > $shop_id,request_id > $request_…

【Dify智能體】2025 最新版Linux部署Dify教程(Ubuntu)

一、前言 Dify 是一款開源的智能體工作流平臺,可以用來快速構建 AI 應用。相比手動搭建復雜的依賴環境,Docker Compose 部署方式更簡單、更快速、更穩定。本文將一步步帶你在 Ubuntu 22.04 + Docker Compose v2 上安裝 Dify,并給出常見問題與優化方案。 ps:如果還沒有安裝…