關于數據結構6-哈希表和5種排序算法

哈希表

1哈希算法

將數據通過哈希算法映射成一個鍵值,存取都在同一個位置實現數據的高效存儲和查找,將時間復雜度盡可能降低至O(1)

2哈希碰撞

多個數據通過哈希算法得到的鍵值相同,成為產生哈希碰撞

3哈希表:

  • 構建哈希表存放0-100之間的數據
  • 哈希算法選擇:
    • 將0-100之間的數據的各位作為鍵值

4. 哈希表的實現

????????1. 哈希表插入

????????

linknode *phashtable[INDEX];
// 一個名為phashtable的指針型數組,一共INDEX個元素 每個元素的值都是linknode*型 指向鏈表的頭節點指針
// phashtable是二級指針哦 指向數組頭元素的地址常量(數組內元素都為地址 指向指針的指針則是二級指針)
int insert_hashtable(int tmpdata)
{int key = 0;linknode **pptmpnode = NULL;linknode *pnewnode = NULL;key = tmpdata % INDEX;//*pptmpnode != NULL說明哈希表當前這個元素后面有鏈表// 注意:你要操作循環的是 存放哈希表的元素指針值(這里變化的i是 二級指針)// pptmpnode等于哈希表里存的元素的地址// 先1 若2 再3(把指針往后挪一個)若2 再3 直到找到存放大于輸入的數據的鏈表位置退出循環for (pptmpnode = &phashtable[key]; *pptmpnode != NULL && (*pptmpnode)->data < tmpdata; pptmpnode = &((*pptmpnode)->pnext)){}// 新建鏈式空間pnewnode = malloc(sizeof(linknode));if (pnewnode == NULL){perror("fail to malloc");return -1;}pnewnode->data = tmpdata;pnewnode->pnext = *pptmpnode; // 若你插入的數字是62 *pptmpnode則是指向72節點的地址*pptmpnode = pnewnode;        //**ptmpnode 同時也是指向52節點里面pnext的值 改這個值return 0;
}

2. 哈希表遍歷

 int show_hashtable(void){int i = 0;linknode *ptmpnode = NULL;for (i = 0; i < INDEX; i++){printf("%d:", i);ptmpnode = phashtable[i];while (ptmpnode != NULL){printf("%2d ", ptmpnode->data);ptmpnode = ptmpnode->pnext;}printf("\n");}return 0;}

排序和查找算法:

1.冒泡排序

  • 1. 時間復雜度為O(n^{2})
  • 2. 穩定的排序算法
  • 3. 排序方法:
    • 相鄰的兩個元素比較,大的向后走,小的向前走
    • 循環找len-1個大的值

int bubble_sort(int *parray, int len){int i = 0;int j = 0;int tmp = 0;for (j = 0; j < len-1; j++){for (i = 0; i < len-1-j; i++){if (parray[i] > parray[i+1]){tmp = parray[i];parray[i] = parray[i+1];parray[i+1] = tmp;}}}return 0;}

2. 選擇排序

  • 1. 時間復雜度O(n^{2})
  • 2. 不穩定排序算法
  • 3. 排序方法:
    • 從前到后找最小值與前面的元素交換
    • 找到len-1個最小值嗎,最后一個最大值即排序完成

 int select_sort(int *parray, int len){int i = 0;int j = 0;int tmp = 0;int min = 0;for (j = 0; j < len-1; j++){min = j;for (i = j+1; i < len; i++){if (parray[i] < parray[min]){min = i;}}if (min != j){tmp = parray[min];parray[min] = parray[j];parray[j] = tmp;}}return 0;}

3.插入排序

  • 1. 時間復雜度O(n^{2}),如果是組有序時間復雜度降低至O(n)
  • 2. 穩定的排序算法
  • 3. 排序方法:
    • 將數組中的每個元素插入到有序數列中
    • 先將要插入的元素取出O(n^{2})
    • 依次和前面元素比較,比元素大的向后走,直到前一個元素比要插入的元素小,或者到 達有序數列開頭停止
    • 插入元素即可

 int insert_sort(int *parray, int len){int tmp = 0;int i = 0;int j = 0;for (j = 1; j < len; j++){tmp = parray[j];for (i = j; i > 0 && tmp < parray[i-1]; i--){parray[i] = parray[i-1];}parray[i] = tmp;}return 0;
}

4.希爾排序

  • 時間復雜度O(nlogn)
  • 不穩定的排序算法
    • ?通過選擇不同的步長,將數組拆分成若干個小的數組實現插入排序
    • 若干個小的數組稱為有序數列后,使得數組中的數據大致有序
    • ?最后再對整體完成一個插入排序

????????

/* 耗時: 5 - 10ms*/int shell_sort(int *parray, int len){int step = 0;int j = 0;int i = 0;int tmp = 0;for (step = len/2; step > 0; step /= 2){for (j = step; j < len; j++){tmp = parray[j];for (i = j; i >= step && tmp < parray[i-step]; i -= 
step){parray[i] = parray[i-step];}parray[i] = tmp;}}return 0;}

5.快速排序

????????1. 時間復雜度為O(nlogn)

????????2. 不穩定的排序算法

????????3. 選擇左邊的作為鍵值,從后面找一個比鍵值小的放前面,從前面找一個比鍵值大的放后面,鍵 值放中間

????????4. 左右兩邊有元素則遞歸調用快速排序

int quick_sort(int *parray, int low, int high){int key = 0;int j = 0;int i = 0;key = parray[low];j = high;i = low;while (i < j){while (i < j && parray[j] >= key){j--;}if (i < j){parray[i] = parray[j];}while (i < j && parray[i] <= key){i++;}if (i < j){parray[j] = parray[i];}    }parray[i] = key;if (i-1 > low){quick_sort(parray, low, i-1);}if (i+1 < high){quick_sort(parray, i+1, high);}return 0;}

6.折半查找(二分查找)

????????時間復雜度O(logn)

 int mid_search(int *parray, int low, int high, int tmpdata){int mid = 0;if (low > high){return -1;}mid = (low + high) / 2;if (tmpdata == parray[mid]){return mid;}else if (tmpdata > parray[mid]){return mid_search(parray, mid+1, high, tmpdata);}else if (tmpdata < parray[mid]){return mid_search(parray, low, mid-1, tmpdata);}}

7順序查找

時間復雜度為O(n)

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

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

相關文章

AWT與Swing深度對比:架構差異、遷移實戰與性能優化

全面對比分析Java AWT與Swing GUI框架的架構差異、性能表現和適用場景&#xff0c;提供完整的AWT到Swing遷移實戰指南&#xff0c;包含15代碼示例、性能測試數據、最佳實踐建議&#xff0c;助你做出明智的技術選型和實現平滑遷移。 Java AWT, Swing, GUI框架對比, 代碼遷移, 性…

git倉庫檢測工具

介紹 Gitleaks 是一款用于檢測git 倉庫、文件以及任何你想通過 git 傳遞的信息(例如密碼、API 密鑰和令牌)的工具stdin。如果你想了解更多關于檢測引擎工作原理的信息,請查看這篇博客:正則表達式(幾乎)就是你所需要的一切。 ? ~/code(master) gitleaks git -v○│╲│…

【4】Transformers快速入門:自然語言模型 vs 統計語言模型

一句話關系總結 統計語言模型 自然語言模型的“數學基礎” &#xff08;就像加減乘除是數學的基礎&#xff0c;統計模型是AI學說話的基礎工具&#xff09;區別對比表&#xff08;小白版&#xff09;維度統計語言模型自然語言模型本質用數學公式算句子概率用神經網絡模仿人腦理…

[激光原理與應用-252]:理論 - 幾何光學 - 傳統透鏡焦距固定,但近年出現的可變形透鏡(如液態透鏡、彈性膜透鏡)可通過改變自身形狀動態調整焦距。

一、液態透鏡&#xff1a;電潤濕效應驅動曲率變化基本結構液態透鏡由兩種互不相溶的液體&#xff08;如導電水溶液與絕緣硅油&#xff09;封裝在透明圓筒形容器中構成。容器壁經疏水處理&#xff0c;使水溶液呈圓頂型聚集在中心&#xff0c;與硅油形成凸狀曲面。工作原理電潤濕…

wordpress數據庫導入時的#1044錯誤

在wordpress網站數據庫文件.sql導入到數據庫時&#xff0c;發生錯誤&#xff0c;錯誤提示如下&#xff1a;#1044 – Access denied for user ‘wodepress_com’’localhost’ to database ‘wodepress’。 這個錯誤表明用戶wodepress_com沒有權限訪問數據庫wodepress。以下是解…

微服務ETCD服務注冊和發現

1.什么是注冊中心 注冊中心主要有三種角色&#xff1a; 服務提供者&#xff08;RPC Server&#xff09;&#xff1a;在啟動時&#xff0c;向 Registry 注冊自身服務&#xff0c;并向 Registry 定期發送心跳匯報存活狀態。 服務消費者&#xff08;RPC Client&#xff09;&…

計算機網絡---默認網關(Default Gateway)

一、默認網關的定義 默認網關&#xff08;Default Gateway&#xff09;是一個網絡設備&#xff08;通常是路由器、防火墻或三層交換機&#xff09;的IP地址&#xff0c;它是本地網絡中的設備訪問其他網絡&#xff08;如外網、其他子網&#xff09;時&#xff0c;數據報文的“第…

OpenBMC中libgpio架構與驅動交互全解析:從硬件映射到應用控制

1. libgpio概述與核心定位 libgpio作為OpenBMC中GPIO管理的核心庫&#xff0c;扮演著連接硬件驅動與上層應用的橋梁角色。它通過標準化的接口抽象了不同硬件平臺的GPIO操作細節&#xff0c;使得電源控制、傳感器監控等關鍵功能能夠以統一的方式訪問GPIO資源。 1.1 libgpio在Ope…

開放原子開源生態大會:麒麟信安加入openEuler社區AI聯合工作組,聚焦操作系統開源實踐與行業賦能

7月23日&#xff0c;由開放原子開源基金會主辦的2025開放原子開源生態大會在京開幕&#xff0c;大會以“開源賦能產業&#xff0c;生態共筑未來”為主題。工業和信息化部副部長熊繼軍、北京市人民政府副秘書長許心超出席大會并致辭。作為開放原子開源基金會黃金捐贈人和開源重要…

Lyapunov與SAC算法的數學結構對比:從二次漂移到TD損失

一、李雅普諾夫優化中二次漂移函數的推導 李雅普諾夫優化的核心是通過設計 “李雅普諾夫函數” 和 “漂移項”&#xff0c;保證系統狀態收斂到穩定點。以下以線性時不變系統為例&#xff08;非線性系統推導邏輯類似&#xff0c;僅動力學方程更復雜&#xff09;&#xff0c;推導…

WireShark:非常好用的網絡抓包工具

文章目錄一、寫在前面二、安裝三、使用1、入門使用&#xff08;1&#xff09;打開軟件&#xff08;2&#xff09;右鍵網卡&#xff0c;Start Capture(開始捕獲)2、界面詳細介紹3、過濾器設置一、寫在前面 Wireshark是使用最廣泛的一款「開源抓包軟件」&#xff0c;常用來檢測網…

WEB技術演進史:從C/S到微服務架構

WEB技術 HTTP協議和B/S 結構 操作系統有進程子系統&#xff0c;使用多進程就可以充分利用硬件資源。進程中可以多個線程&#xff0c;每一個線程可以被CPU調度執行&#xff0c;這樣就可以讓程序并行的執行。這樣一臺主機就可以作為一個服務器為多個客戶端提供計算服務。 客戶端…

win11中Qt5.14.0+msvc2019+opencv4.9配置

本文主要研究由msvc編譯的opencv在QT中的配置&#xff0c;opencv可以是官網直接下載的版本&#xff0c;也可以是msvc(例如vs2019)通過cmake編譯 contrib功能的opencv版本&#xff0c;這2種版本對qt版本沒有嚴格要求&#xff0c;但是若在cmake中選擇了with_qt功能&#xff0c;那…

【listlist模擬】

list&list模擬1.list使用2、list模擬附錄1.list使用 list常見接口不做介紹&#xff0c;跟前面vector有相似之處&#xff0c;跟數據結構list基本一樣。 ?因為list使用帶頭的雙向循環鏈表實現的&#xff0c;不能用小標訪問&#xff0c;只能用迭代器或范圍for訪問 list有成…

在CentOS 7上將PostgreSQL數據庫從默認路徑遷移到自定義目錄

在CentOS 7上將PostgreSQL數據庫從默認路徑遷移到自定義目錄&#xff0c;需遵循以下步驟。假設原數據目錄為“/var/lib/pgsql/12/data”&#xff0c;目標目錄為“/new/path/pgdata”。 1、步驟概覽 停止PostgreSQL服務創建新目錄并設置權限復制數據文件&#xff08;保留權限&am…

C語言基礎06——結構體(struct)

一、結構體的概念結構體&#xff08;struct&#xff09;是 C 語言中一種自定義數據類型&#xff0c;它允許你將不同類型的數據項組合在一起&#xff0c;形成一個新的復合數據類型。想象一下&#xff1a;如果要表示一個 "學生"&#xff0c;需要包含姓名&#xff08;字…

小白入門指南:Edge SCDN 輕松上手

在互聯網飛速發展的當下&#xff0c;網站性能與安全至關重要。對于小白而言&#xff0c;Edge SCDN 可能是個陌生概念&#xff0c;但它卻能極大助力網站運營。本文將用簡單易懂的語言&#xff0c;帶大家了解 Edge SCDN&#xff0c;探討其運用方法。?一、Edge SCDN 是什么&#…

探秘酵母單雜交技術:解鎖基因調控的密碼

在生命科學研究領域&#xff0c;基因的表達調控機制一直是科學家們關注的焦點。為了深入探究這一復雜過程&#xff0c;眾多先進技術應運而生&#xff0c;酵母單雜交技術便是其中極具價值的一項&#xff0c;它為研究 DNA 與蛋白質之間的相互作用提供了獨特視角與有效手段。酵母單…

大模型備案要點一次過【附材料清單詳解】

最近&#xff0c;廣東省公布了最新一批的大模型備案&#xff08;登記&#xff09;名單&#xff0c;很多準備要做大模型備案的企業都在紛紛咨詢&#xff1a;“大模型備案的周期是多久&#xff1f;”“做大模型備案有什么要求&#xff1f;”“做大模型備案一共需要準備多少材料&a…

啟保停-----------單相照明燈的接法

一.單相照明燈-K21使用的器材,單相電能表,空開,插座,開關,燈泡二.啟 保 停1.需要用到的器材1.空開2.三相電機3.接觸器4.熔斷器5.按鈕2.電路的作用按按鈕 運轉 在按按鈕 停止運轉3.電動4.加上輔助觸點 控制電路5.在加上按鈕 停止電路