【數據結構】排序(直接插入排序,希爾排序)

目錄

一、排序的概念

?二、常見的排序算法

?三、插入排序

1.直接插入排序

?1.直接插入排序實現

2.直接插入排序特性及復雜度

2.希爾排序?

1.排序思路

2.希爾排序實現?

3.希爾排序的特性及復雜度?


一、排序的概念

排序:所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。

穩定性:假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次 序保持不變,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,則稱這種排 序算法是穩定的;否則稱為不穩定的。

內部排序:數據元素全部放在內存中的排序。

外部排序:數據元素太多不能同時放在內存中,根據排序過程的要求不能在內外存之間移動數據的排序。

?二、常見的排序算法

最常用的排序算法可以分為四大類:
插入排序、選擇排序、交換排序與歸并排序。插入排序的代表算法有直接插入排序與希爾排序;選擇排序的排序算法代表是選擇排序與堆排序;交換排序中我們要熟識冒泡排序與快速排序;歸并排序則主要是以歸并排序算法為主,及一些由歸并思想衍生出的排序算法。?

?三、插入排序

1.直接插入排序

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

實際中我們玩撲克牌時,就用了插入排序的思想

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

?1.直接插入排序實現

首先我們解決單次排序,從后向前比較,如果a[end] > tmp,則把a[end + 1] 和?a[end] 進行交換,然后再向前比較,當end跑到頭時end+1剛好為0。

因為第一個數字不用排,所以需要循環n-1趟

void InserSort(int* a, int n)
{for (int i = 1; i < n; i++){int end = i - 1;int tmp = a[i];while (end >= 0){if (a[end] > tmp){a[end + 1] = a[end];end--;}else{break;}}a[end + 1] = tmp;}
}
2.直接插入排序特性及復雜度

直接插入排序的特性總結:

1. 元素集合越接近有序,直接插入排序算法的時間效率越高

2. 時間復雜度:O(N^2)

3. 空間復雜度:O(1),它是一種穩定的排序算法

4. 穩定性:穩定

2.希爾排序?

1.排序思路

????????希爾排序法又稱縮小增量法。希爾排序法的基本思想是:先選定一個整數,把待排序文件中所有記錄分成個 組,所有距離為的記錄分在同一組內,并對每一組內的記錄進行排序。然后,取,重復上述分組和排序的工作。當到達=1時,所有記錄在統一組內排好序。

簡單來說,意思是取一個整數,作為 間距gap ,對于每個元素,與其間隔為gap 的元素分成一個組,對每組排序 。不斷調整gap,對每組進行不斷排序,在 gap調整到 1 后進行插入排序,就可以將數據排成有序。而按照間距gap分組并排序被稱為?預排序?。

所以,希爾排序可分為兩步,預排序(讓數據接近有序)和直接插入排序

2.希爾排序實現?

希爾排序和直接插入排序思路是差不多的,當gap = 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 (a[end] > tmp){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}
}

這里的gap不僅是每組中元素的間距,也是組數。上面代碼只完成了單組,對于完整的一組需要在外面套上一層循環,需要循環gap次

//優化
for (int i = 0; i < n - gap; i++)
{int end = i;int tmp = a[end + gap];while (end >= 0){if (a[end] > tmp){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;
}

希爾排序的特性總結:

1. 希爾排序是對直接插入排序的優化。

2. 當gap > 1時都是預排序,目的是讓數組更接近于有序。當gap == 1時,數組已經接近有序的了,這樣就 會很快。這樣整體而言,可以達到優化的效果。我們實現后可以進行性能測試的對比。

3. 希爾排序的時間復雜度不好計算,因為gap的取值方法很多,導致很難去計算,因此在好些書中給出的希爾排序的時間復雜度都不固定?

這里為什么gap/3后要+1呢,因為每次+1,到最后必定是1?

void ShellSort(int* a, int n)
{int gap = n;while (gap > 1){gap = gap / 3 + 1;//gap = gap / 2;for (int i = 0; i < n - gap; i++){int end = i;int tmp = a[end + gap];while (end >= 0){if (a[end] > tmp){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}
}
3.希爾排序的特性及復雜度?

Knuth進行了大量的試驗統計,得出最接近的結論,希爾排序的最終時間復雜度為 O(N^1.3)左右。?

而空間復雜度就很簡單了,并沒有開辟額外的空間,所以空間復雜度為 O(1) 。

希爾排序是對直接插入排序的優化。
當 增量 > 1時都是預排序,目的是讓數組更接近于有序。當增量為 1 時,數組已經接近有序了,再進行排序就能提高算法執行的時間效率。
時間復雜度:O(N^1.3) 。
空間復雜度:O(1) 。
穩定性:不穩定。

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

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

相關文章

python手寫數字識別(PaddlePaddle框架、MNIST數據集)

python手寫數字識別&#xff08;PaddlePaddle框架、MNIST數據集&#xff09; import paddle import paddle.nn.functional as F from paddle.vision.transforms import Compose, Normalizetransform Compose([Normalize(mean[127.5],std[127.5],data_formatCHW)]) # 使用tran…

[Java基礎揉碎]多線程基礎

多線程基礎 什么是程序, 進程 什么是線程 什么是單線程,多線程 并發, 并行的概念 單核cpu來回切換, 造成貌似同時執行多個任務, 就是并發; 在我們的電腦中可能同時存在并發和并行; 怎么查看自己電腦的cpu有幾核 1.資源監視器查看 2.此電腦圖標右鍵管理- 設備管理器- 處理器…

k8s 二進制安裝 詳細安裝步驟

目錄 一 實驗環境 二 操作系統初始化配置&#xff08;所有機器&#xff09; 1&#xff0c;關閉防火墻 2&#xff0c;關閉selinux 3&#xff0c;關閉swap 4, 根據規劃設置主機名 5, 做域名映射 6&#xff0c;調整內核參數 7&#xff0c; 時間同步 三 部署 dock…

uniapp vu3 scroll-view 滾動到指定位置

設置 scroll-view <scroll-view :scroll-y"true" :scroll-with-animation"true" :scroll-top"scrollTop" :style"height:${height}px"><view v-for"item in 10" :id"box${item}">box {{item}}</v…

原生IP介紹

原生IP&#xff0c;顧名思義&#xff0c;即初始真實IP地址&#xff0c;是指從互聯網服務提供商獲得的IP地址&#xff0c;IP地址在互聯網與用戶之間直接建立聯系&#xff0c;不需要經過代理服務器代理轉發。 原生IP具備以下特點。 1.直接性 原生IP可以直接連接互聯網&#xff…

337_C++_內存對齊操作,內存分配、或其他需要數據對齊的場合中是很常見的操作

size_t ImagesCache::_alignSize(size_t srcSz, size_t alnSz) {if (0 == alnSz) {printf("[ImagesCache] Incorrect input parameters\n");return srcSz;

代碼隨想錄算法訓練營第五十四天

第二題我看了很久還是沒太明白&#xff0c;我發現理解動規有一點點吃力了啊&#xff0c;努努力。 392.判斷子序列 總感覺在不等于的時候&#xff0c;應該是dp[i][j] dp[i-1][j-2]; 這里其實按他那個圖會更好理解一點。 class Solution { public:bool isSubsequence(string s, …

Gone框架介紹19 -如何進行單元測試?

gone是可以高效開發Web服務的Golang依賴注入框架 github地址&#xff1a;https://github.com/gone-io/gone 文檔地址&#xff1a;https://goner.fun/zh/ 請幫忙在github上點個 ??吧&#xff0c;這對我很重要 &#xff1b;萬分感謝&#xff01;&#xff01; 文章目錄 單元測試…

CentOs安裝

安裝 開發工具 &#xff1a;GCC、 JDK、mysql 如果出現藍屏&#xff0c;要在BIOS開啟虛擬化支持&#xff0c;或者移除打印機。

Google:站長移除無效網址

當您的網址不需要呈現在Google站長中時&#xff0c;您可以在站長工具中移除網址 操作步驟&#xff1a;登錄Google站長&#xff0c;綁定網站完成后&#xff0c;點擊左側刪除 >> 輸入網址 如果遇到一些網址&#xff0c;可以找尋網址間的規律&#xff0c;比如說&#xff0…

2024生日快樂祝福HTML源碼

源碼介紹 2024生日快樂祝福HTML源碼&#xff0c;源碼由HTMLCSSJS組成&#xff0c;記事本打開源碼文件可以進行內容文字之類的修改&#xff0c;雙擊html文件可以本地運行效果&#xff0c;也可以上傳到服務器里面&#xff0c; 源碼截圖 源碼下載 2024生日快樂祝福HTML源碼

Shell腳本 <<EOF ... EOF語法(Here Document)(特殊的輸入重定向方式)(定界符)

文章目錄 Here Document語法Here Document 的基本語法使用場景 關于定界符定界符不是變量定界符在 Here Document 中只是一個字符串&#xff0c;主要功能是標記輸入文本的開始和結束&#xff0c;使用時應遵循最佳實踐格式要求例子和說明如何使用定界符定界符可重復使用&#xf…

Spring數據訪問全攻略:從JdbcTemplate到聲明式事務

上文講到 —— 航向數據之海&#xff1a;Spring的JPA與Hibernate秘籍 本文目錄 四. JdbcTemplate的使用定義JdbcTemplate及其在Spring中的作用展示如何使用JdbcTemplate簡化數據庫操作1. 配置JdbcTemplate2. 使用JdbcTemplate查詢數據3. 打印查詢結果 五. Spring的事務管理介紹…

橋接模式

橋接模式&#xff1a;在這種模式下&#xff0c;虛擬機就像是局域網中一臺獨立的主機&#xff0c;能夠訪問網內任何一臺機器。在橋接模式下&#xff0c;必須為虛擬系統手動配置IP地址、子網掩碼&#xff0c;并且這些配置需要與宿主機器處于同一網段&#xff0c;以便虛擬系統和宿…

leetcode-42. 接雨水(雙指針,前綴)

42. 接雨水 /*** param {number[]} height* return {number}*/ var trap function (height) {let len height.length;let pre_max new Array(len).fill(0);let suf_max new Array(len).fill(0);pre_max[0] height[0];suf_max[len - 1] height[len - 1];for (let i 1; i…

queue使用

C的queue是一種先進先出&#xff08;FIFO&#xff09;的數據結構&#xff0c;可以用來存儲一系列元素。它屬于STL&#xff08;Standard Template Library&#xff09;的一部分&#xff0c;以queue模板類的形式提供。 要使用queue&#xff0c;需要包含頭文件&#xff0c;并使用…

Linux shell編程學習筆記49:strings命令

0 前言 在使用Linux的過程中&#xff0c;有時我們需要在obj文件或二進制文件中查找可打印的字符串&#xff0c;那么可以strings命令。 1. strings命令 的功能、格式和選項說明 我們可以使用命令 strings --help 來查看strings命令的幫助信息。 pupleEndurer bash ~ $ strin…

在k8s中搭建elasticsearch高可用集群,并對數據進行持久化存儲

&#x1f407;明明跟你說過&#xff1a;個人主頁 &#x1f3c5;個人專欄&#xff1a;《洞察之眼&#xff1a;ELK監控與可視化》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目錄 一、引言 1、Elasticsearch簡介 2、k8s簡介 二、環境準備 …

Git項目管理——提交項目和版本回退(二)

個人名片&#xff1a; &#x1f393;作者簡介&#xff1a;嵌入式領域優質創作者&#x1f310;個人主頁&#xff1a;妄北y &#x1f4de;個人QQ&#xff1a;2061314755 &#x1f48c;個人郵箱&#xff1a;[mailto:2061314755qq.com] &#x1f4f1;個人微信&#xff1a;Vir2025WB…

android繪制多個黑豎線條

本文實例為大家分享了android繪制多個黑豎線條展示的具體代碼&#xff0c;供大家參考&#xff0c;具體內容如下 1.寫一個LinearLayout的布局&#xff0c;將寬度寫成5dp將高度寫成match_parent. 2.在寫一個類繼承LinearLayout&#xff0c;用LayoutInflater實現子布局的在這個L…