排序(冒泡排序、選擇排序、插入排序、希爾排序)-->深度剖析(一)

歡迎來到我的Blog,點擊關注哦💕

前言

排序是一種基本的數據處理操作,它涉及將一系列項目重新排列,以便按照指定的標準(通常是數值大小)進行排序。在C語言中,排序算法是用來對元素進行排序的一系列步驟。

排序的概況

C語言中的排序算法是一系列用于將一組數據按照特定順序進行排列的算法。這些算法通常根據元素之間的大小關系來確定它們在最終排序結果中的位置。

衡量排序的標準

  • 時間復雜度(參考:時間空間復雜度介紹)
  • 輔助空間:有些排序算法在排序過程中需要額外的空間來輔助排序,例如歸并排序和快速排序。這些算法的輔助空間通常為O(n),而有些算法如插入排序和冒泡排序的輔助空間為O(1)
  • 穩定性:穩定性是指在排序過程中,相等鍵值的元素在原始序列中的相對位置是否保持不變。穩定排序算法會維持相等元素的相對次序,而不穩定排序算法則可能改變這些元素的相對次序。
  • 特殊情況下性能:某些排序算法在特定情況下可能表現得更優,例如當數據已經部分有序時,插入排序和冒泡排序可能會更快。而快速排序在這種情況下可能會變慢。

冒泡排序(Bubble Sort)

冒泡排序概念

冒泡排序是一種交換排序,它的基本思想是:兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄為止。這個過程會重復進行,直到沒有再需要交換的元素,這意味著數列已經排序完成。這個過程就像是氣泡一樣,較小(或較大)的元素會逐漸“冒泡”到列表的頂端

在這里插入圖片描述

代碼實現

冒泡排序算法的實現通常涉及兩個嵌套的for循環。外層循環控制每一輪的比較次數,內層循環用于比較相鄰元素并進行交換。

//冒泡排序
void BubbleSort(int* a, int n)
{for (int i = 0; i < n; i++){for (int j = i; j < n-i-1; j++){if (a[j] > a[j + 1]){Swap(&a[j], &a[j + 1]);}}}
}

優化冒泡排序

當冒泡排序遇見 {2,1,4,5,6,7,8,9,10} 這樣的數據就會大大折扣性能。如遇見如此的數據進行排序,我們可以定義一個bool類型flag = false 當數據進行交換的時候我們改變flag;

代碼如下:

//冒泡排序
void BubbleSort(int* a, int n)
{for (int i = 0; i < n; i++){bool flag = false;for (int j = i; j < n-i-1; j++){if (a[j] > a[j + 1]){Swap(&a[j], &a[j + 1]);flag = true;}if (flaf == false){break;}}}
}

冒泡排序復雜度分析

冒泡排序算法的時間復雜度為O(n^2), 這是因為在最壞的情況下,即數組完全逆序時,冒泡排序需要進行n-1輪比較和交換,其中n是數組的長度。每一輪比較需要比較n-i次(i為當前輪數),因此總的比較次數為n*(n-1)/2。所以,冒泡排序的時間復雜度為O(n^2)

選擇排序(Selection Sort)

選擇排序的概念

選擇排序(Selection Sort)是一種簡單直觀的排序算法,它的基本思想是在每一輪中從不排序的子序列中選取最小(或最大)的元素,將其與子序列的起始位置的元素交換,從而逐漸構建起有序序列。

在這里插入圖片描述

代碼實現

選擇排序思想簡單,排序大->小(小->大),就遍歷數組記錄即可。

//交換
void Swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}//選擇排序
void SelectSort(int* a, int n)
{int min = 0;int begin = 0;while (begin < n - 1){for (int i = begin; i < n; i++){if (a[i] < a[min]){min = i;}}Swap(&a[min], &a[begin]);++begin;}
}

優化選擇排序

選擇排序可以通過一些優化手段進行提升,例如使用哨兵變量來減少內層循環的判斷次數等。這些優化手段可以在一定程度上提高選擇排序的執行效率。(在這里就不實現了

選擇排序的復雜度分析

選擇排序的時間復雜度為 O(n^2),其中n是數組的長度。這是因為算法需要進行兩層循環,外層循環控制排序的輪數,內層循環則負責在每一輪中找到最小元素。

插入排序(Insertion Sort)

插入排序的概念

插入排序是一種簡單直觀的排序算法,它的基本思想是將未排序的元素插入到已排序元素形成的有序序列中。在每一輪排序中,都會將一個待排序的元素插入到它應該所在的位置,直到所有元素都被插入完畢。
在這里插入圖片描述

代碼實現

定義循環進行比較將大(小)的值相后面依次挪動,直至尋找到比自己小(大)的值位置進行插入。

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

插入排序的優化

  • 可以進行二分插入,它通過二分查找來確定待插入位置,從而減少了比較和移動的次數。
  • 希爾排序是對直接插入排序的優化,它通過增加一個間隙因子來分組排序,使得每個組內部的元素可以先進行排序,然后逐漸減小間隙因子,直到間隙因子為1,此時整個數組已經接近有序,插入排序的效率會得到提高

插入排序復雜度分析

  • 最佳情況:如果輸入數組已經是完全有序的,插入排序只需要進行 n 次比較(每次比較后插入一個元素到已排序部分),而不需要進行任何交換。在這種情況下,時間復雜度是 O(n)
  • 平均情況:在平均情況下,插入排序的時間復雜度是 O(n^2)。這是因為每個元素都需要與已排序部分的多個元素進行比較,平均下來,每個元素需要比較 n/2 次。
  • 最壞情況:如果輸入數組是完全逆序的,插入排序需要進行 n(n-1)/2 次比較和 n(n-1)/2 次交換,時間復雜度是 O(n^2)

希爾排序(Shell Sort)

希爾排序的概念

希爾排序(Shell Sort)是一種基于插入排序的算法,它通過引入增量序列,采取分組排序策略:將大數組分為若干個子序列,對每個子序列進行插入排序。隨著增量逐漸減小,子序列變得更小,最終達到增量為1,整個數組變成一個有序序列,完成排序。這種排序方式使得希爾排序在初始階段,使用較大的步長讓序列更快時間的接近有序,并且減少了不必要的比較與交換。

代碼實現

//希爾排序
void ShellSort(int* a, int n)
{int gap = n;while (gap >= 1){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;}}
}

希爾排序復雜度分析

希爾排序算法的平均時間復雜度通常被認為是介于 O(n log n) 和 O(n^2) 之間,具體取決于所選擇的間隔序列。在最佳情況下,當間隔序列滿足特定條件時,希爾排序可以達到接近 O(n) 的時間復雜度。然而,在最壞情況下,希爾排序的時間復雜度為 O(n^2)。

break;}}a[end + gap] = tmp;}
}

}


## 希爾排序復雜度分析希爾排序算法的平均時間復雜度通常被認為是介于 O(n log n) 和 O(n^2) 之間,具體取決于所選擇的間隔序列。在最佳情況下,當間隔序列滿足特定條件時,希爾排序可以達到接近 O(n) 的時間復雜度。然而,在最壞情況下,希爾排序的時間復雜度為 O(n^2)。

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

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

相關文章

FPGA 690T NVME高速存儲設計

高速存儲設計會有各種需求的考慮&#xff0c;那么對應的方案也不完全相同&#xff0c;這篇文章出一期純FPGA實現的高速存儲方案。用純fpga實現高速存儲板卡有易國產化&#xff0c;功耗低和體積小等特點&#xff0c;缺點就是靈活性不是很強&#xff0c;實現標準ext4和nfs文件系統…

計算機的錯誤計算(十六)

摘要 計算機的錯誤計算&#xff08;十五&#xff09;中歷史事件給我們的啟示或警示。 計算機的錯誤計算&#xff08;十五&#xff09;介紹了歷史上發生的一些事件。從這些事件我們可以得到一些啟示或警示。 若不是油氣平臺的沉沒&#xff0c;設計者會得出精度低了嗎&#x…

信息盲盒系統設計

信息盲盒系統是一種結合了隨機性和趣味性的信息傳遞和接收方式&#xff0c;類似于實體盲盒的概念&#xff0c;但在數字領域應用。這種系統通常用于增加用戶參與度、提升用戶體驗或作為營銷策略的一部分。設計一個信息盲盒系統需要考慮以下幾個關鍵要素&#xff1a; 1. 定義目標…

數據倉庫建模基礎理論-01-為什么需要數據建模?

一、什么是數據模型&#xff1f; 數據模型是數據庫的基礎結構&#xff0c;用于描述和組織數據的方式。 它不僅是數據庫的底層結構&#xff0c;還是一個概念性工具&#xff0c;幫助理解數據的含義和關系。 數據模型包括數據本身、數據之間的關系、數據的語義&#xff08;含義和…

C++ | Leetcode C++題解之第206題反轉鏈表

題目&#xff1a; 題解&#xff1a; class Solution { public:ListNode* reverseList(ListNode* head) {if (!head || !head->next) {return head;}ListNode* newHead reverseList(head->next);head->next->next head;head->next nullptr;return newHead;} …

在Ubuntu 16.04上安裝和配置GitLab的方法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到網站。 簡介 GitLab CE&#xff08;Community Edition&#xff09;是一個開源應用程序&#xff0c;主要用于托管 Git 倉庫&#xff0c;并提供額…

AI在創造還是毀掉音樂之論文

AI在創造還是毀掉音樂&#xff1f; 簡介&#xff1a;最近一個月&#xff0c;輪番上線的音樂大模型&#xff0c;一舉將素人生產音樂的門檻降到了最低&#xff0c;并掀起了音樂圈會不會被AI徹底顛覆的討論。短暫的興奮后&#xff0c;AI產品的版權歸屬于誰&#xff0c;創意產業要…

一秒記單詞:音通義通,一秒牢記

一秒記單詞&#xff0c;從小學到高中&#xff0c;一秒牢記 一、小學生記單詞&#xff0c;快速突破 1.1 好的開始&#xff0c;是成功的一半 sun n.太陽 【通】尚 moon n.月亮 【通】母恩 mother n.母親&#xff0c;媽 【通】媽汁 sea n.海&#xff0c;大海 【通】細 sand …

【MySQL基礎篇】SQL指令:DQL及DCL

1、DQL DQL - 介紹 DQL英文全稱是Data Query Language(數據查詢語言)&#xff0c;數據查詢語言&#xff0c;用來查詢數據表中的記錄。&#xff08;在MySQL中應用是最為廣泛的&#xff09; 查詢關鍵字&#xff1a;SELECT DQL - 語法 SELECT 字段列表 FROM 表名列表 WHER…

【人工智能學習之圖像操作(六)】

【人工智能學習之圖像操作&#xff08;六&#xff09;】 Hough變換直線檢測圓檢測 圖像分割 Hough變換 在圖像處理中&#xff0c;霍夫變換用來檢測任意能夠用數學公式表達的形狀&#xff0c;即使這個形狀被破壞或者有點扭曲 直線檢測 import cv2 import numpy as np image …

利用微信開放標簽<wx-open-launch-weapp>在H5中跳轉微信小程序報錯完美的解決方案

一、報錯&#xff1a; [WXTAG] [JSCORE] The slot <template> or <script type"text/wxtag-template"> of <wx-open-launch-weapp> is missing 二、源碼 官方源代碼如下&#xff0c;<script type"text/wxtag-template"></sc…

美團外賣搜索基于Elasticsearch的優化實踐--圖文解析

美團外賣搜索基于Elasticsearch的優化實踐–圖文解析 前言 美團在外賣搜索業務場景中大規模地使用了 Elasticsearch 作為底層檢索引擎&#xff0c;隨著業務量越來越大&#xff0c;檢索速度變慢了&#xff0c;CPU快累趴了&#xff0c;所以要進行優化。經過檢測&#xff0c;發現…

gcop:簡化 Git 提交流程的高效助手 | 一鍵生成 commit message

&#x1f496; 大家好&#xff0c;我是Zeeland。Tags: 大模型創業、LangChain Top Contributor、算法工程師、Promptulate founder、Python開發者。&#x1f4e3; 個人說明書&#xff1a;Zeeland&#x1f4e3; 個人網站&#xff1a;https://me.zeeland.cn/&#x1f4da; Github…

[SAP ABAP] 數據字典

ABAP數據字典是定義和管理數據庫對象的工具 系統的所有全局數據類型以及數據庫表結構等都需要在數據字典中創建和維護(數據字典中的對象對所有ABAP程序都是全局的) 通過數據字典&#xff0c;我們可以把數據庫對象管理好&#xff0c;后續才能順利的進行功能開發&#xff0c;SA…

華為面試題及答案——大數據

(1)namenode內存滿了,如何進行擴容,調什么參數。 1. 增加 NameNode 的內存 在 hadoop-env.sh 文件中,可以增加 JVM 分配給 NameNode 的內存。通常是在 HADOOP_NAMENODE_OPTS 中增加 -Xmx 參數來增加最大堆內存。 export HADOOP_NAMENODE_OPTS="-Xmx8g -Xms4g ${HA…

集合,Collection接口

可動態保存任意多個對象&#xff0c;使用比較方便 提供了一系列方便操作對象的方法&#xff1a;add&#xff0c;remove&#xff0c;set&#xff0c;get等 使用集合添加刪除新元素&#xff0c;代碼簡潔明了 單列集合 多列集合 Collection接口 常用方法 List list new Arra…

設計模式詳解(一)——策略模式

策略模式&#xff08;Strategy Pattern&#xff09;是一種行為型的設計模式&#xff0c;它允許你定義一系列算法&#xff0c;然后將它們封裝起來&#xff0c;使它們可以相互替換。這樣做的好處是&#xff0c;你可以動態地選擇要使用的算法&#xff0c;而不必在運行時進行檢查或…

多媒體基礎

筆者按&#xff1a; 昨日復習的信息網絡安全約莫是掛了&#xff0c;常言道&#xff1a;知恥而后勇。誠如斯言 于是決心多媒體是不能再掛了&#xff0c;不然直接變成xxx之流&#xff0c;自增笑耳 語雀鏈接&#xff1a;多媒體基礎 一.多媒體計算機概述 媒體&#xff1a;承載信息…

動手學深度學習(Pytorch版)代碼實踐 -卷積神經網絡-21多輸入多輸出通道

21多輸入多輸出通道 import torch from d2l import torch as d2ldef corr2d(X, K):"""計算二維互相關運算"""h, w K.shapeY torch.zeros((X.shape[0] - h 1, X.shape[1] - w 1))for i in range(Y.shape[0]):for j in range(Y.shape[1]):Y[i,…

go語言DAY7 字典Map 指針 結構體 函數

Go中Map底層原理剖析_go map底層實現-CSDN博客 目錄 Map 鍵值對key,value 注意&#xff1a; map唯一確定的key值通過哈希運算得出哈希值 一、 map的聲明及初始化&#xff1a; 二、 map的增刪改查操作&#xff1a; 三、 map的賦值操作與切片對比&#xff1a; 四、 通用所有…