排序算法-插入/希爾排序

1 插入排序

1.1基本思想:

直接插入排序是一種簡單的插入排序法,其基本思想是:把待排序的記錄按其關鍵碼值的大小逐個插入到一個已經排好序的有序序列中,直到所有的記錄插入完為止,得到一個新的有序序列 。

1.2直接插入排序:

當插入第i(i>=1)個元素時,前面的array[0],array[1],…,array[i-1]已經排好序,此時用array[i]的排序碼與 array[i-1],array[i-2],…的排序碼順序進行比較,找到插入位置即將array[i]插入,原來位置上的元素順序后移。

直接插入排序的特性總結:
1. 元素集合越接近有序,直接插入排序算法的時間效率越高
2. 時間復雜度:O(N^2)
3. 空間復雜度:O(1),它是一種穩定的排序算法
4. 穩定性:穩定

?寫排序算法的一種好習慣就是先寫一個單趟排序,再使用循環來實現整體。假設實現一個升序,首先創建一個變量end=0,然后tmp保存a[end+1]的值,寫一個while循環,結束條件是end<0,進入循環判斷tmp和a[end]的大小,如果tmp小則將a[end]的值覆蓋到a[end+1],然后end--,跳出循環,此時將tmp插入到a[end+1]也就是a[0]這個位置。如果tmp>=a[end],直接退出循環。然后將tmp的值插入到a[end+1]這個位置。然后最外層套一層循環,每次單趟結束后end++。

// 插入排序
void InsertSort(int* a, int n)
{for (int i = 0; i < n - 1; i++){int end =i;int tmp = a[end + 1];while (end >= 0){if (tmp < a[end]){a[end + 1] = a[end];}else{break;}end--;}a[end + 1] = tmp;}
}

2.希爾排序( 縮小增量排序 )

希爾排序法又稱縮小增量法。希爾排序法的基本思想是: 先選定一個整數,把待排序文件中所有記錄分成個 組,所有距離為的記錄分在同一組內,并對每一組內的記錄進行排序。然后取重復上述分組和排序的工 作。當到達 =1 時,所有記錄在統一組內排好序
假設將下列數組分為gap=3組,先完成單趟,將end=0,tmp保存a[end+gap]這個位置的值,進行比較,tmp大則將a[end]覆蓋到[end+gap]這個位置,然后end-gap,退出循環,將tmp插入到a[end+gap]這個位置,也就是a[0]這個位置。然后寫一個循環控制end的位置,每次end+gap。到這里就完成了黑色的這一組數據,此時可以再套一層循環控制住紅色和藍色的這兩組數據。
void ShellSort1(int* a, int n)
{int gap = n;while (gap > 1){gap = gap / 3 + 1;for (int j = 0; j < gap; j++){for (int i = j; i < n - gap; i += gap){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;}}}
}

當然也可以在單趟外只套一層循環,巧妙地控制i。

void ShellSort2(int* a, int n)
{int gap = n;while (gap > 1){//gap = gap / 2;gap = gap / 3 + 1;for (int 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. 希爾排序是對直接插入排序的優化。
2. gap > 1 時都是預排序,目的是讓數組更接近于有序。當 gap == 1 時,數組已經接近有序的了,這樣就 會很快。這樣整體而言,可以達到優化的效果。我們實現后可以進行性能測試的對比。
3. 希爾排序的時間復雜度不好計算,因為 gap 的取值方法很多,導致很難去計算,因此在好些樹中給出的 希爾排序的時間復雜度都不固定。

4. 穩定性:不穩定 ?。


今天的分享到這里就結束了,感謝大家的閱讀!

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

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

相關文章

CentOS7.0 下rpm安裝MySQL5.5.60

下載 下載路徑: MySQL :: Download MySQL Community Server -->looking for the latest GA version-->5.5.60 此壓縮包中有多個rpm包 有四個不是必須的,只需安裝這三個 MySQL-server-5.5.60-1.el6.x86_64 MySQL-devel-5.5.60-1.el6.x86_64 MySQL-client-5.5.60-1.el6.x8…

pymysql insert dataframe 遇到 nan 值

def get_db_conn():"""MYSQL連接"""host Config.MYSQL["host"]pwd Config.MYSQL["pwd"]user Config.MYSQL["user"]port Config.MYSQL["port"]database Config.MYSQL["database"]conn p…

智能淘客查券返利機器人與導購app:差異與優勢

智能淘客查券返利機器人與導購app&#xff1a;差異與優勢 在數字化購物的時代&#xff0c;我們發現越來越多的工具幫助我們省錢和賺錢。其中&#xff0c;智能淘客查券返利機器人和導購app是兩種非常受歡迎的工具。然而&#xff0c;這兩種工具在運作方式、功能以及效果上存在明…

代碼隨想Day 31 | 455.分發餅干、376. 擺動序列 、53. 最大子序和

455.分發餅干 這道題目我的思路就是&#xff0c;先滿足小胃口的小朋友&#xff0c;這樣能夠滿足更多人&#xff0c;首先把兩個數組排序&#xff0c;然后依次對比&#xff0c;不滿足某個胃口小的小朋友就一直給更大的餅干&#xff0c;詳細代碼如下&#xff1a; class Solution…

【js】js實現多個視頻連續播放:

文章目錄 一、效果&#xff1a;二、實現&#xff1a; 一、效果&#xff1a; 二、實現&#xff1a; <!DOCTYPE html> <html> <head><title>Video Player</title><style>#progressBar { width: 800px;height: 20px;background-color: #dd…

【Vulnhub 靶場】【Momentum: 2】【簡單】【20210628】

1、環境介紹 靶場介紹&#xff1a;https://www.vulnhub.com/entry/momentum-2,702/ 靶場下載&#xff1a;https://download.vulnhub.com/momentum/Momentum2.ova 靶場難度&#xff1a;簡單 發布日期&#xff1a;2021年06月28日 文件大小&#xff1a;698 MB 靶場作者&#xff1…

uni-app實現安卓原生態調用身份證閱讀器讀卡庫讀身份證和社保卡、銀行卡、IC卡等功能

DONSEE系列多功能讀寫器Android Uniapp API接口規范V1.0.0 本項目Uniapp調用了身份證讀卡器的庫文件&#xff1a;DonseeDeviceLib-debug.aar&#xff0c;該庫放到nativeplugins\donsee-card\android&#xff0c;然后會自動加載。SDK會自動檢查是否擁有USB設備權限&#xff0c;…

同旺科技 USB TO RS-485 定制款適配器--- 拆解(三)

內附鏈接 1、USB TO RS-485 定制款適配器 ● 支持USB 2.0/3.0接口&#xff0c;并兼容USB 1.1接口&#xff1b; ● 支持USB總線供電&#xff1b; ● 支持Windows系統驅動&#xff0c;包含WIN10 / WIN11系統32 / 64位&#xff1b; ● 支持Windows RT、Linux、Mac OS X、Windo…

《洛谷深入淺出進階篇》p2568 GCD

P2568 GCD - 洛谷 | 計算機科學教育新生態 (luogu.com.cn)https://www.luogu.com.cn/problem/P2568 大致題意&#xff1a;給定正整數n&#xff0c;求1< x,y<n 且 gcd&#xff08;x&#xff0c;y&#xff09;為素數的數對&#xff08;x&#xff0c;y&#xff09;有多少對。…

一文搞懂全連接算法和它的作用

如果你是搞AI算法的同學&#xff0c;相信你在很多地方都見過全連接層。 無論是處理圖片的卷積神經網絡&#xff08;CNN&#xff09;&#xff0c;還是處理文本的自然語言處理&#xff08;NLP&#xff09;網絡&#xff0c;在網絡的結尾做分類的時候&#xff0c;總是會出現一個全…

國外小哥綜合傳統CGI和AI技術制作出融合Lofi音樂與人工智能動畫作品

這個視頻制作花費了18個小時&#xff0c;渲染則耗費了4個小時&#xff0c;使用了Midjourney、PS GenFill、After Effects和Magnific AI等工具。 國外小哥綜合傳統CGI和AI技術制作出融合Lofi音樂與人工智能動畫作品 大致制作流程&#xff1a; Midjourney出圖&#xff0c;PS Gen…

P1047 [NOIP2005 普及組] 校門外的樹題解

題目 某校大門外長度為 l 的馬路上有一排樹&#xff0c;每兩棵相鄰的樹之間的間隔都是1 米。我們可以把馬路看成一個數軸&#xff0c;馬路的一端在數軸 00 的位置&#xff0c;另一端在l 的位置&#xff1b;數軸上的每個整數點&#xff0c;即0,1,2,…,l&#xff0c;都種有一棵樹…

藍橋杯:貨物擺放

小藍有一個超大的倉庫&#xff0c;可以擺放很多貨物。 現在&#xff0c;小藍有 n 箱貨物要擺放在倉庫&#xff0c;每箱貨物都是規則的正方體。小藍規定了長、寬、高三個互相垂直的方向&#xff0c;每箱貨物的邊都必須嚴格平行于長、寬、高。 小藍希望所有的貨物最終擺成一個大…

帶大家做一個,易上手的家常辣子雞

先從冰箱拿出雞肉解凍 拿小半根蔥 去掉最外面一層皮 切成小段 最備好 花椒 干辣椒 準備四五個大料 起鍋燒油 這道菜需要放其他菜兩到三倍的油 油溫上來之后 放入干辣椒和花椒進行翻炒 等它們都燒黑之后撈出來 這樣 辣味就留在油里面了 然后 倒入雞肉 蔥段 大料 然后 倒…

linux下ls和df卡死

1. strace看下卡在哪里 https://lokie.wang/article/43 strace ls strace df -h 2. 原因 https://segmentfault.com/a/1190000040620740 3. fuser 和 umount都不行&#xff0c;最后只能重啟 重啟機器還起不來了垃圾

Linux Server Quick Command

Linux Server Quick Command 查看服務器gpu情況&#xff1a;gpustat conda install gpustat nvidia-smi也可以監控 實時監控gpu狀態&#xff1a; 進入后臺運行&#xff1a;$ tmux &#xff08;tmux使用方法&#xff09; 退出當前窗口&#xff1a;先按下ctrlb&#xff0c;再按下…

php獲取本年、本月、本周時間戳和日期格式(2020)

獲取時間戳&#xff1a; //獲取今日開始時間戳和結束時間戳 $time1 strtotime(date(Y-m-d 00:00:00,time())); $time2 strtotime(date(Y-m-d 23:59:59,time()));//昨天時間戳 $time1 strtotime(date(Y-m-d 00:00:00,time()-3600*24)); $time2 strtotime(date(Y-m-d 23:59:…

Docker實戰筆記 一 Nginx鏡像

1.創建一個文件夾映射容器內文件 rootcenots-7.5:/home#mkdir demo rootcenots-7.5:/home#ll 2.拉取nginx鏡像 rootcenots-7.5:/home/demo#docker pull nginx Using default tag: latest latest: Pulling from library/nginx 1f7ce2fa46ab: Already exists 9b16c94bb686: P…

Qt內存管理、UI編輯器、客制化組件、彈出對話框、常用部件類

頭文件的小技巧 #include <QtWidgets> // 在自動生成的 .h 里面加上此句 適用條件&#xff1a; QT 的內存管理 當父窗體被關閉時&#xff0c;子部件的內存會自動釋放。 對象樹是一種管理對象生命周期的機制。當一個對象被添加到另一個對象的子對象列表中時&#xff0…

LeetCode刷題筆記之鏈表

一、移除鏈表元素 1. 203【移除鏈表元素】 題目&#xff1a; 給你一個鏈表的頭節點 head 和一個整數 val &#xff0c;請你刪除鏈表中所有滿足 Node.val val 的節點&#xff0c;并返回 新的頭節點 。代碼&#xff1a; /*** Definition for singly-linked list.* public cla…