排序(一)——冒泡排序、直接插入排序、希爾排序(BubbleSOrt,InsertSort,ShellSort)

????????歡迎來到繁星的CSDN,本期的內容主要包括冒泡排序(BubbleSort),直接插入排序(InsertSort),以及插入排序進階版希爾排序(ShellSort)。

????????廢話不多說,直接上正題!

一、冒泡排序

? ? ? ? 冒泡排序是我們的老朋友了,我們最初模擬實現qsort的時候就是用它來模擬的(盡管qsort的底層原理實際是quicksort,即快排)。

? ? ? ? 上代碼!

void BubbleSort(int* a, int n)
{for (int j = 0; j < n; j++){// 單趟int flag = 0;for (int i = 1; i < n - j; i++){if (a[i - 1] > a[i]){Swap(&a[i - 1], &a[i]);flag = 1;}}if (flag == 0){break;}}
}

? ? ? ? 代碼相當簡單,其思想就是通過兩兩之間的比較,每一趟都將最大的數據放在數組的最后

? ? ? ? 缺點是,冒泡排序的速度相當慢,原因不僅僅在于比較的次數恒定(n*(n+1)/2次),更在于如果數據量龐大,各個數據移動的速度也相當慢。

? ? ? ? 實際意義聊勝于無,但卻很好地幫我們入門各大排序算法,這是它仍然活躍的意義。

? ? ?二、直接插入排序

? ? ? ?我們一般會叫它插入排序,在此加入“直接”二字,是為了區分它和希爾排序。

? ? ? ? 插入排序的思路也是較為簡單的。

? ? ? ? 面對一個有n個元素的數組,如果前n-1個元素都有序,那么第n個元素通過和前面所有元素比較,就能得到該元素在數組中的位置。有一點數學歸納法的思想在里面。

? ? ? ? 上代碼!

void InsertSort(int* a, int n)
{//  [0, n-1]for (int i = 0; i < n - 1; i++){// [0, n-2]是最后一組// [0,end]有序 end+1位置的值插入[0,end],保持有序int end = i;int tmp = a[end + 1];while (end >= 0){if (tmp < a[end]){a[end + 1] = a[end];--end;}else{break;}}a[end + 1] = tmp;}
}

? ? ? ? 由于一個元素一定有序,所以第一個元素不用排序。而從第二個元素開始,通過比較,不斷插入到前面的數組中,使前n項都有序,如此往復,便可使得整個數組有序。

? ? ? ? 相比于冒泡排序,插入排序少了大量重復的交換數值的工作,而是一步到位,得到數據的最終位置(盡管時常需要將所有數據后移,但代碼中只是賦值,而非交換,效率比冒泡高的多)。

? ? ? ? 兩者運行時間差別:

????????

? ? ? ? (此處數據為10000個)

? ? ? ? 盡管如此,我們在實際工作中也很少使用直接插入排序,即使時間比冒泡排序少的多,其時間復雜度仍為O(n^2)。但不得不指出,它仍有應用,后續在快排的時候將會提到。

三、希爾排序

????????

????????希爾排序是插入排序的優化版本,優化到可以和快速排序一較高下。

????????希爾排序主要做兩件事:1、預排序。2、插入排序。

? ? ? ? 由插入排序的代碼可知,當數組越趨近于有序,比較和賦值的次數也越來越少。所以預排序的目的就是使得整個數組接近有序。

? ? ? ? 上代碼!

void ShellSort(int* a, int n)
{int gap = n;while (gap > 1){// +1保證最后一個gap一定是1// gap > 1時是預排序// gap == 1時是插入排序gap = gap / 3 + 1;for (size_t i = 0; i < n - gap; ++i){int end = i;int tmp = a[end + gap];while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}
}

? ? ? ? 要點解釋:

1、gap代表的含義是,下標相減為gap的元素為一組,進行插入排序。此舉的意義是使得O(n^2)的復雜度造成的影響盡可能小,因為a*(n/a)^2小于n^2,a為任意整數。

2、而當gap等于1時再進行排序,就是插入排序了。

3、gap的大小實際上由寫代碼的人自己決定,沒有一定gap越大,或者gap越小的效果最好,但可以確定的是,經過預排序的插排會比直接插排要更快。

4、上述代碼中的gap是一個效果較好的gap,可以參照并直接使用。

????????本篇內容到此結束,謝謝大家的觀看!

????????覺得寫的還不錯的可以點點關注,收藏和贊,一鍵三連。

? ? ? ? 我們下期再見~

? ? ? ? 往期欄目:

????????一文帶你入門二叉樹!-CSDN博客

????????棧和隊列的介紹與實現-CSDN博客

????????設計掃雷游戲_掃雷游戲設計-CSDN博客

????????

????????

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

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

相關文章

制作微信商城的步驟是什么

在當今這個數字化時代&#xff0c;微信已成為人們日常生活中不可或缺的一部分。隨著微信生態的日益完善&#xff0c;微信商城成為了眾多企業和商家拓展線上業務、觸達潛在客戶的重要渠道。那么&#xff0c;如何制作一個高效、專業的微信商城呢&#xff1f;本文將為您詳細解析制…

做突破交易時,需要注意的進場細節有哪些?

突破交易揭示了市場未來的走向。 在這種情況下&#xff0c;面對市場時我們應該如何入場操作呢&#xff1f;接下來&#xff0c;讓我們來細化一下實施的具體步驟。 01. 在交易中&#xff0c;周期的考量比價格突破更為關鍵。 當價格突破發生時&#xff0c;市場的平靜被打破&#x…

生物素化的曼陀羅凝集素;Datura Stramonium Lectin

一、基本信息 中文名稱&#xff1a;生物素化的曼陀羅凝集素 英文名稱&#xff1a;Datura Stramonium Lectin (Biotinylated) 常用名&#xff1a;曼陀羅凝集素&#xff0c;生物素化 CAS號&#xff1a;N/A&#xff08;因不同制造商和產品而異&#xff0c;且可能未公開&#xff09…

MySQL黑馬教學對應視屏筆記分享之聚合函數,以及排序語句的講解筆記

聚合函數 注意&#xff1a;null值不參與聚合函數的計算。 分組查詢 2.where與having的區別 執行時機不同&#xff1a;where是在分組之前進行過濾&#xff0c;不滿足where條件&#xff0c;不參與分組&#xff1b;而having是分組之后對結果進行過濾。判斷條件不同&#xff1a;w…

【區塊鏈 + 智慧政務】一體化政務數據底座平臺 | FISCO BCOS應用案例

為進一步貫徹落實《全國一體化政務大數據體系建設方案》、《中共中央國務院關于構建數據基礎制度更好發揮 數據要素作用的意見》精神&#xff0c;一體化政務數據底座平臺結合相應城市的數字經濟現狀基礎、當前任務及未來發展 戰略&#xff0c;規劃建設數據底座&#xff0c;持續…

新品牌快速成長指南:揭秘品牌成功的黃金法則

打造一個新品牌是一個系統性工程&#xff0c;不是一兩句話就能說清楚的。 作為一個13年的營銷人&#xff0c;今天試圖給大家以最簡練和通俗的文字&#xff0c;詳細講講打造一個全新的品牌都需要做些啥&#xff1f;碼字不易&#xff0c;請多給點支持哦。 一、市場調研與定位&a…

python+selenium-UI自動框架之[優化]元素查找和BasePage頁面

痛點&#xff1a;在頁面查找元素的時候會遇到找不到或者其他無法處理某個字段的情況&#xff0c;又或者想要在輸出的log或者report里面顯示這個字段名稱&#xff0c;這時候加上字段名稱就很重要&#xff01; [3]pythonselenium - UI自動框架之封裝查找元素https://mp.csdn.net…

PHP微信小程序視頻圖文流量主變現小程序系統源碼

&#x1f4b0;微信小程序新機遇&#xff01;視頻圖文流量主變現秘籍&#x1f511; &#x1f680;【流量變現新風口】&#x1f680; 還在為微信小程序的龐大流量如何轉化為真金白銀而苦惱嗎&#xff1f;今天&#xff0c;就帶你揭秘“微信小程序視頻圖文流量主變現小程序”的神…

GPT-5:探索NLP新紀元的無限可能

目錄 GPT-5: 定義自然語言處理新紀元的全方位突破引言: 邁向未來的語言之橋算法與架構: 深度進化的基石多模態融合: 超越文本的智慧對話連貫性與情境感知: 無縫交流的藝術個性化與定制化: 專屬服務的未來倫理與安全: 負責任的創新GPT系列發展史: 邁向卓越的每一步結語: 共創智能…

Linux賬戶和組管理——賬戶和工作組分類,用戶賬號文件,/etc/passwd文件中7個字段,id 命令

## 賬戶和工作組的分類 ### 用戶分為三類&#xff1a; - 超級賬戶——賬戶名為root&#xff0c;它具有一切權限&#xff0c;只有進行系統維護(例如&#xff1a;建立用戶等)或其他必要情形下才用超級用戶登錄&#xff0c;以避免系統出現安全問題。 - 系統賬戶——是Linux系統正常…

幾種常用的產生負電源的方法

電源電路是電路設計的重要環節&#xff0c;一般情況下&#xff0c;單電源能實現功能的用單電源就行&#xff0c;可選的方案很多&#xff0c;DC-DC、LDO等芯片很多。有時候&#xff0c;單電源無法滿足需求時&#xff0c;就必須用到負電源。 今天就來介紹幾種常用的負電源產生的…

北京金融聯盟創新應用2024年第五期“圓桌會議”成功召開

來自信創CPU廠商、金融科技相關企業、以及銀行證券等機構的數十名參會代表齊聚北京&#xff0c;圍繞信創服務器芯片架構使用策略等議題&#xff0c;展開了深入的討論&#xff0c;為金融信創與數字化轉型的進一步深入發展提供了豐富的建議和參考。 會議圍繞信創服務器芯片架構使…

什么是業務架構、數據架構、應用架構和技術架構

TOGAF(The Open Group Architecture Framework)是一個廣泛應用的企業架構框架&#xff0c;旨在幫助組織高效地進行架構設計和管理。而TOGAF的核心就是由我們熟知的四大架構領域組成&#xff1a;業務架構、數據架構、應用架構和技術架構。 所以今天我們就來聊聊&#xff0c;企業…

高通平臺 android7.1 藍牙的可見性設置

1、情景 本機設備只打開藍牙開關&#xff0c;但不停留在設置里面藍牙頁面時&#xff0c;其他設備掃描不到本機設備。 2、Android7.1中&#xff0c;默認的行為是&#xff0c;只有在設置里面的藍牙頁面&#xff0c;才會開啟藍牙的可見性&#xff1b;如果只是打開下拉欄的藍牙快捷…

基于MacOS系統Sonoma 14.5的SSH服務禁止密碼登錄

基于系統Sonoma 14.5&#xff0c;不同系統有所差異。 修改sshd_config文件 sudo vim /etc/ssh/sshd_config找到以下兩行取消注釋&#xff0c;修改值為 no PasswordAuthentication no KbdInteractiveAuthentication no重啟sshd服務 # 關閉服務 sudo launchctl unload -w /System…

安泰電壓放大器的選型方案是什么

電壓放大器是一種常見的電路元件&#xff0c;廣泛應用于各種電子設備中。在選擇電壓放大器的時候&#xff0c;我們需要考慮一系列因素&#xff0c;以確保選型方案能夠滿足實際需求。下面安泰電子將詳細介紹電壓放大器選型的主要考慮因素&#xff0c;包括應用需求、技術性能、成…

自己寫的逆向案例十二——一號店登錄密碼逆向

網址&#xff1a;1號店登錄 找到登錄接口&#xff1a; 查看棧 直接跟棧&#xff0c;不多說 &#xff0c;點擊doubblesubmit棧 很明顯發現加密位置&#xff0c;而且有很明顯的提示&#xff0c;這是一個標準RSA類型的&#xff0c;看到new JSEncrypt和setPublicKey就知道了&…

【AI大模型新型智算中心技術建設白皮書 2024】

文末有福利&#xff01; 一、新算效——重塑計算架構 1.1 下一代 AI 芯片設計思路 以 GPU 為 代 表 的 高 性 能 并 行 計 算 芯 片 架 構 和 以 針 對 AI 領 域 專 用 加 速&#xff08;DSA, Domain Specific Architecture&#xff0c;DSA&#xff09;為代表的芯片架構是目…

setuptools打包-分發-安裝-發布

一、定義 學習網址setup.py 編寫打包安裝開源到PYPI中 二、實現 學習網址 https://python.iswbm.com/c08/c08_15.htmlsetup.py 編寫 采用分發工具setuptools進行發布&#xff0c;因此采用setuptools包進行setup.py的編寫 demo案例 from setuptools import setup, find_pack…

springboot下 創建TCO客戶端,并發送消息

import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service;import java.io.*; import java.net.Socket;/*** 請求tcp接口** author Mr丶s* date 2024/7/10 下午3:03* description*/ Slf4j Service public class TcpClientService {private Socket soc…