圖解希爾排序C語言實現

1 希爾排序

希爾排序(Shell Sort)是D.L.Shell于1959年提出來的一種排序算法,在這之前排序算法的時間復雜度基本都是O(n2),希爾排序算法是突破這個時間復雜度的第一批算法之一。

1.1 基本概念與原理

希爾排序通過將原始列表分割成若干子序列進行插入排序,隨著增量逐漸減小,最終對整個列表進行一次插入排序。
核心思想
?1.增量序列?:選擇一個增量序列(gap sequence),將數組分成若干子序列
?2.子序列排序?:對每個子序列進行插入排序
?3.逐步縮小增量?:重復上述過程,直到增量為1
?4.最終排序?:當增量為1時,對整個數組進行最后一次插入排序
希爾排序之所以高效,是因為它利用了插入排序在"部分有序"數組上表現良好的特性。通過前期的大增量排序,使得數組逐漸趨于有序,減少了后期小增量排序時的數據移動次數。

1.2 算法執行過程

1.增量序列選擇
希爾排序的性能很大程度上取決于增量序列的選擇。常見的增量序列有:
Shell原始序列:n/2, n/4, …, 1
Hibbard序列:1, 3, 7, …, 2^k - 1
Sedgewick序列:1, 5, 19, 41, 109,…
2. 具體執行步驟
以數組[8, 3, 9, 1, 5, 7, 2, 6]為例,使用Shell原始序列(n/2, n/4,…):
?初始數組?:[8, 3, 9, 1, 5, 7, 2, 6] (n=8)
?第一輪(gap=4,分成4組序列)?
子序列1:[8,5] → [5,8]
子序列2:[3,7] → [3,7]
子序列3:[9,2] → [2,9]
子序列4:[1,6] → [1,6]
?結果?:[5, 3, 2, 1, 8, 7, 9, 6]
?第二輪(gap=2,分成2組序列)?
子序列1:[5,2,8,9] → [2,5,8,9]
子序列2:[3,1,7,6] → [1,3,6,7]
?結果?:[2, 1, 5, 3, 8, 6, 9, 7]
?第三輪(gap=1,分成1組序列)?
對整個數組進行插入排序
?最終結果?:[1, 2, 3, 5, 6, 7, 8, 9]

1.3 算法復雜度分析

時間復雜度
希爾排序的時間復雜度分析較為復雜,因為它依賴于增量序列的選擇:
?最壞情況?:O(n2) - 當增量序列不佳時
?平均情況?
Shell原始序列:O(n^(3/2))
Hibbard序列:O(n^(3/2))
Sedgewick序列:O(n^(4/3))
?最好情況?:O(nlogn) - 當數組已經部分有序時
空間復雜度
希爾排序是原地排序算法,空間復雜度為O(1)。
穩定性
希爾排序是不穩定的排序算法,因為相同的元素可能在各自的插入排序中移動。

1.4 C語言實現希爾排序

#include <stdio.h>#define SORT_DATA_TYPE int/*** @brief 打印數據** @param arr 數組* @param n 數組元素個數*/
void print_array(int arr[], int n)
{int i;for (i = 0; i < n; i++){printf("%d ", arr[i]);}printf("\n");
}/*** @brief 希爾排序** @param arr 待排序的數組* @param n 數組元素個數*/
void shell_sort(int arr[], int n)
{SORT_DATA_TYPE temp;int gap;int i, j;/* 初始增量gap為數組長度的一半,逐步縮小 */for (gap = n / 2; gap > 0; gap /= 2){/* 從第gap個元素開始,逐個對其所在子序列進行插入排序 */for (i = gap; i < n; i++){temp = arr[i];/* 對子序列進行插入排序 */for (j = i; j >= gap; j -= gap){if (arr[j - gap] > temp){arr[j] = arr[j - gap];}else{break;}}arr[j] = temp;print_array(arr, n); /* 查看每次排序結構,調試使用 */}printf("result :"); /* 查看每次排序結構,調試使用 */print_array(arr, n);}
}int main()
{SORT_DATA_TYPE arr[] = {4, 3, 2, 1};int n = sizeof(arr) / sizeof(arr[0]);printf("old arr : ");print_array(arr, n);shell_sort(arr, n);printf("new arr : ");print_array(arr, n);return 0;
}


不同類型的數組直接將SORT_DATA_TYPE全部替換為需要的類型,然后刪除多余的宏定義即可支持任意類型數組的希爾排序。

1.5 簡單測試

通過使用數組[4,3,2,1]演示希爾排序的執行過程:
在這里插入圖片描述
可以使用如下圖片演示這一過程:
在這里插入圖片描述

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

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

相關文章

網絡協議——HTTPS協議

目錄 一、HTTPS是什么 加密是什么 二、HTTPS的工作過程 &#xff08;一&#xff09;對稱加密 &#xff08;二&#xff09;非對稱加密 &#xff08;三&#xff09;在非對稱加密的基礎上&#xff0c;引入證書校驗 證書是什么 證書的內容 用證書解決中間人攻擊 三、總結 …

React 基礎實戰:從組件到案例全解析

React 基礎實戰專欄:從組件到案例全解析 本專欄圍繞 React 核心概念(組件、Props、State、生命周期)展開,通過 6個實戰案例+核心知識點拆解,幫你掌握 React 基礎開發邏輯,每篇聚焦1個實戰場景,搭配完整代碼與原理講解,適合 React 入門者鞏固基礎。 專欄目錄 【組件傳…

ARM芯片架構之CoreSight Channel Interface 介紹

CoreSight Channel Interface&#xff08;通道接口&#xff09;詳解1. 概述 Channel Interface 是 ARM CoreSight 架構中用于在不同組件之間傳遞觸發事件的專用接口。它是 Event Interface 的增強版本&#xff0c;支持多通道、雙向通信&#xff0c;以及同步與異步兩種時鐘域連接…

Blender模擬結構光3D Scanner(二)投影儀內參數匹配

關于投影儀外參的設置可參見前一篇文章 Blender模擬結構光3D Scanner&#xff08;一&#xff09;外參數匹配-CSDN博客 使用Projectors插件模擬投影儀 Step 1 在Github下載插件&#xff08;https://github.com/Ocupe/Projectors&#xff09;。下載zip壓縮包即可&#xff0c;無…

synchronized的作用

目錄 一、核心作用 二、實現原理&#xff1a;基于"對象鎖" 三、使用方式 四、鎖的優化 五、優缺點 六、總結 synchronized 是 Java 中用于解決多線程并發安全問題的核心關鍵字&#xff0c;它的主要作用是實現線程間的同步&#xff0c;確保多個線程在訪問共享資…

機試備考筆記 14/31

2025年8月14日 小結&#xff1a;&#xff08;17號整理14號的筆記&#xff0c;這輩子真是有了w(&#xff9f;Д&#xff9f;)w&#xff09;昨天摔了跤大的&#xff0c;今天好媽媽在家&#xff0c;松弛。省流&#xff1a;6道中等&#xff0c;明天只學了10分鐘嘻嘻 目錄LeetCode22…

dolphinscheduler中任務輸出變量的問題出現ArrayIndexOutOfBoundsException

一段腳本任務如下&#xff1a;ret/data/dolphinscheduler/loadOraTable.sh "yonbip/yonbip10.16.10.69:1521/orcl" "select t.bondcontractno,t.olcunissuemny from yonbip.bond_contract t " "/dmp/biz" "bip" "2025-08-13"…

OpenCv(二)——邊界填充、閾值處理

目錄 一、邊界填充&#xff08;Border Padding&#xff09; 1. 常見填充類型及效果 2.代碼示例 &#xff08;1&#xff09;constant邊界填充&#xff0c;填充指定寬度的像素 &#xff08;2&#xff09;REFLECT鏡像邊界填充 &#xff08;3&#xff09;REFLECT_101鏡像邊界…

Leetcode 15 java

今天復習一下翻轉二叉樹 226. 翻轉二叉樹 給你一棵二叉樹的根節點 root &#xff0c;翻轉這棵二叉樹&#xff0c;并返回其根節點。 示例 1&#xff1a; 輸入&#xff1a;root [4,2,7,1,3,6,9] 輸出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 輸入&#xff1a;root [2…

嵌入式學習的第四十九天-時鐘+EPIT+GPT定時器

一、時鐘1.時鐘系統基本概念&#xff08;1&#xff09;PLL (鎖相環, Phase-Locked Loop)作用&#xff1a;PLL是一種反饋控制電路&#xff0c;用于生成穩定的高頻時鐘信號。它通過將輸出時鐘與參考時鐘進行比較和調整&#xff0c;可以產生比輸入參考時鐘頻率高得多的輸出時鐘。倍…

Python Sqlalchemy數據庫連接

Python Sqlalchemy數據庫連接一、連接數據二、模型三、ORM操作一、連接數據 from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker# 1. 連接數據庫 dbHost postgres://用戶名:密碼主機:端口/數據庫名 engine create_engine(dbHost) # create_engi…

【Node.js】ECMAScript標準 以及 npm安裝

目錄 一、 ECMAScript標準 - 默認導出和導入 二、ECMAScript標準 - 命名導出和導入 三、包的概念 五、 npm - 安裝所有依賴 六、 npm - 全局軟件包 Node.js總結 總結不易~ 本章節對我有很大的收獲&#xff0c; 希望對你也是&#xff01;&#xff01;&#xff01; 本節素材…

NPM 、 NPX

NPM vs. NPX 簡單來說&#xff0c;npm 是一個 node 包管理器&#xff0c;npx 是一個 Node 包執行器。 NPX 是一個 Node 包執行器&#xff0c;該 Node 包可以是本地也可以是遠程的。允許開發者在無需安裝的情況下執行任意 Node 包。npm 在安裝nodejs 就自動帶了 npm install -g …

守護品質安全,防偽溯源系統打造全鏈路信任體系

一、引言在當下這個信息透明、品質至上的時代&#xff0c;防偽溯源已經成為眾多品牌保護自身利益、提升消費者信任度的重要手段。為了滿足市場上對高效、可靠的防偽溯源查詢系統的迫切需求&#xff0c;榕壹云精心打造了一款防偽溯源查詢系統。二、項目背景隨著商品市場的不斷擴…

【完整源碼+數據集+部署教程】無人機航拍視角洪水檢測與受災房屋識別圖像分割救援指導系統源碼和數據集:改進yolo11-DCNV2

背景意義 研究背景與意義 隨著全球氣候變化的加劇&#xff0c;極端天氣事件的頻率和強度不斷上升&#xff0c;洪水作為一種常見的自然災害&#xff0c;給人類社會帶來了嚴重的威脅。洪水不僅導致人員傷亡和財產損失&#xff0c;還對基礎設施和生態環境造成了深遠的影響。因此&a…

C# 結構體與類的區別是什么?

結構體是值類型是儲存在棧中獨立儲存的,數據與數據之間不會相互影響,即使將一個結構體賦值給另外一個結構體也不會相互影響。 類是一個模板,實例出來的對象是獨立的不會相互影響,但是將一個對象賦值給另一個對象時 會把指向堆內存中數據的指針賦值給另一個對象.從而發生兩個變量…

Redis GEO

Redis GEO 引言 Redis 是一款高性能的鍵值存儲系統,廣泛應用于緩存、消息隊列等領域。Redis GEO 是 Redis 2.4 版本后新增的一個功能,用于存儲地理位置信息。本文將詳細介紹 Redis GEO 的概念、使用方法以及應用場景。 什么是 Redis GEO? Redis GEO 是 Redis 的一個模塊…

Go從入門到精通系列學習路線規劃

Go從入門到精通系列學習路線規劃 目錄導航 Go從入門到精通系列學習路線規劃首頁說明 第1篇_Go語言初探_環境搭建與HelloWorld 第2篇_Go語言基礎語法_變量常量與數據類型 第3篇_Go語言控制結構_條件判斷與循環 第4篇_Go語言函數詳解 第5篇_Go語言數據結構詳解 第6篇_Go語言結構體…

Grid系統概述

目錄 概念及功能 網格對象&#xff08;Grid Object&#xff09; 和世界對象&#xff08;World Object&#xff09; 工作流程 概念及功能 TrinityCore 的 Grid 系統是一套復雜的地圖分區管理機制&#xff0c;其核心目標是通過動態管控游戲世界的區域狀態和對象生命周期&#…

一文搞懂LLM大模型!LLM從入門到精通萬字長文(2024.12月最新)

LLM從入門到精通精品文章 目錄 一、LLM基本概念 二、LLM發展歷程 三、LLM大模型的分類 四、LLM主流大模型類別 五、LLM大模型建立的流程 六、Fine-Tuning 七、Prompt-Tuning 八、超大規模參數模型Prompt-Tuning方法 8.1上下文學習 In-Context Learning 8.2.指令學習 …