希爾排序和選擇排序及計數排序的簡單介紹

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

希爾排序舉例:

#include <stdio.h>
// 打印
void Printarry(int* arr, int n)
{assert(arr);for (int i = 0;i < n;i++){printf("%d ", arr[i]);}printf("\n");
}
// 希爾排序
// 時間復雜度 O(N^1.3-N^2)
// gap越大,前面大的數據可以越快排到后面,后面小的數可以越快拍到前面,gap越大,越不接近有序
// gap越小越接近有序,如果gap==1其實就是直接插入排序,就有序了
void ShellSort(int* arr, int n)
{assert(arr);int gap = n;// gap>1相當于預排序,讓數組接近有序// gap==1就相當于直接插入排序,保證有序while (gap > 1){gap = gap / 3 + 1; // +1是保證了最后一次gap一定是1// 注意結束條件,防止造成越界訪問(畫圖)for (int i = 0;i < n - gap;i++)  // 多趟并排{// 單趟排序int end = i;               // 當end==0時就是單趟排序,排間距為gap的那一趟int temp = arr[end + gap];  // 將新的排序數值存起來,方便每次比較大小while (end >= 0)   {if (temp < arr[end]){arr[end + gap] = arr[end];end -= gap;}else{break;}}arr[end + gap] = temp;  // 跳出循環后temp放到end+gap位置}// 打印每一個gap時的排序狀態Printarry(arr, n);}}void TestShellSort() 
{int arr[] = { 3,1,4,2,8,4,9,6,0,7 };Printarry(arr, sizeof(arr) / sizeof(arr[0]));ShellSort(arr, sizeof(arr) / sizeof(arr[0]));Printarry(arr, sizeof(arr) / sizeof(arr[0]));
}int main()
{TestShellSort();return 0;
}

選擇排序

每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置(末尾位置),直到全部待排序的 數據元素排完 。

直接選擇排序:

在元素集合arr[i]--arr[n-1]中選擇最大(小)的數據?若它不是這組元素中的最后一個(第一個)元素,則將它與這組元素中的最后一個(第一個)元素交換 在剩余的array[i]--array[n-2](array[i+1]--array[n-1])集合中,重復上述步驟,直到集合剩余1個元素。

舉例:利用雙指方法,begin指向首元素,end指向末尾元素,找到最大值時maxi和end位置數據互換,最小值mini位置和begin位置數據互換。

當begin和maxi重疊時,mini位置的數據和begin位置的數據互換后要將mini的值給到maxi,在將maxi位置的數據和end位置的數據互換。

#include <stdio.h>
// 打印
void Printarry(int* arr, int n)
{assert(arr);for (int i = 0;i < n;i++){printf("%d ", arr[i]);}printf("\n");
}
// 選擇排序
// 空間復雜度為O(1)
// 時間復雜度為 O(N^2),最好的情況是接近有序比較n次即可,最壞的是不完全有序接近無順序
void SelectSort(int* arr, int n)
{assert(arr);int begin = 0;int end = n - 1;//int mini = 0;//int maxi = 0;while (begin < end){int mini = 0;int maxi = 0;maxi = mini = begin;// 在[begin,end]之間選出最大值和最小值for (int i = begin + 1;i <= end;++i){if (arr[i] > arr[maxi]){maxi = i;}if (arr[i] < arr[mini]){mini = i;}}Swap(&arr[begin], &arr[mini]);// 如果maxi與begin位置重疊的話要修正maxi的位置if (begin == maxi)maxi = mini;Swap(&arr[end], &arr[maxi]);--end;++begin;}
}void TestSelectSort()
{int arr[] = { 15,18,23,3,1,14,2,8,4,9,6,0,7 };SelectSort(arr, sizeof(arr) / sizeof(arr[0]));Printarry(arr, sizeof(arr) / sizeof(arr[0]));
}
int main()
{TestShellSort();return 0;
}

計數排序

首先找到待排序數組的最大值和最小值,然后開辟一個空間temp數組,大小為最大值減去最小值加1;然后遍歷數組,將數據出現的次數放到temp數組相對位置中;然后再遍歷temp數組取出對應數據出現的次數,將該數據依次覆蓋回原數組中。

注意:這個排序缺點就是浪費空間比如,待排序數組最小值為100,最大值為1000;那么要開辟0-1000個空間的數組,才能存放比如100出現10次,那么temp數組中下標100位置就存放10,這樣就很浪費空間。我們在這里開辟900個空間的數組,將100出現的次數放到相對位置中,相對位置為:100-min。覆蓋回原數組的時候再加上min即可。相對減少空間浪費。

舉例子:

#include <stdio.h>
// 打印
void Printarry(int* arr, int n)
{assert(arr);for (int i = 0;i < n;i++){printf("%d ", arr[i]);}printf("\n");
}
// 計數排序
// 時間復雜度O(N+range)
// 空間復雜度O(range)
void CountSort(int* arr, int n)
{// 找出最大最小值int min = arr[0];int max = arr[0];for (int i = 1;i < n;i++){if (arr[i] > max)max = arr[i];if (arr[i] < min)min = arr[i];}// 創建計數的空間int range = max - min + 1;int* countArr = (int*)malloc(sizeof(int) * range);memset(countArr, 0, sizeof(int) * range); // 將數組元素置為0// 遍歷數組將相同的數值出現的次數放到相對位置處:arr[i] - minfor (int i = 0;i < n;i++){countArr[arr[i] - min]++;}// 遍歷countArr數組將某個數出現的次數,依次將這個數放回到原數組int index = 0;for (int i = 0;i < range;i++){while (countArr[i]--)  // 控制數據出現的次數{arr[index++] = i + min;}}
}void TestCountSort()
{int arr[] = { 15,18,23,3,1,14,2,8,4,9,6,0,7 };CountSort(arr, sizeof(arr) / sizeof(arr[0]));Printarry(arr, sizeof(arr) / sizeof(arr[0]));
}
int main()
{TestCountSort();return 0;
}

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

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

相關文章

Solid Edge多項目并行,浮動許可如何高效調度?

在制造企業的數字化設計體系中&#xff0c;Solid Edge 作為主流 CAD 工具&#xff0c;因其靈活的建模能力、同步技術和強大的裝配設計功能&#xff0c;廣泛應用于機械設備、零部件制造等行業的研發場景。隨著企業設計任務復雜化&#xff0c;多項目并行成為常態&#xff0c;Soli…

Flink cdc 使用總結

Flink 與 Flink CDC 版本兼容對照表Flink 版本支持的 Flink CDC 版本關鍵說明Flink 1.11.xFlink CDC 1.2.x早期版本&#xff0c;需注意 Flink 1.11.0 的 Bug&#xff08;如 Upsert 寫入問題&#xff09;&#xff0c;建議使用 1.11.1 及以上。Flink 1.12.xFlink CDC 2.0.x&#…

企業培訓筆記:axios 發送 ajax 請求

文章目錄axios 簡介一&#xff0c;Vue工程中安裝axios二&#xff0c;編寫app.vue三&#xff0c;編寫HomeView.vue四&#xff0c;Idea打開后臺項目五&#xff0c;創建HelloController六&#xff0c;配置web訪問端口七&#xff0c;運行項目&#xff0c;查看效果&#xff08;一&am…

Maven下載與配置對Java項目的理解

目錄 一、背景 二、JAVA項目與Maven的關系 2.1標準java項目 2.2 maven 2.2.1 下載maven 1、下載 2、配置環境 2.2.2 setting.xml 1、配置settings.xml 2、IDEA配置maven 一、背景 在java項目中&#xff0c;新手小白很有可能看不懂整體的目錄結構&#xff0c;以及每個…

Mars3d的走廊只能在一個平面的無法折疊的解決方案

問題場景&#xff1a;1. Mars3d的CorridorEntity只能在一個平面修改高度值&#xff0c;無法根據坐標點位制作有高度值的走廊效果&#xff0c;想要做大蜀山盤山走廊的效果實現不了。解決方案&#xff1a;1.使用原生cesium實現對應的走廊的截面形狀、走廊的坐標點&#xff0c;包括…

LeetCode 每日一題 2025/7/7-2025/7/13

記錄了初步解題思路 以及本地實現代碼&#xff1b;并不一定為最優 也希望大家能一起探討 一起進步 目錄7/7 1353. 最多可以參加的會議數目7/8 1751. 最多可以參加的會議數目 II7/9 3439. 重新安排會議得到最多空余時間 I7/10 3440. 重新安排會議得到最多空余時間 II7/11 3169. …

Bash常見條件語句和循環語句

以下是 Bash 中常用的條件語句和循環語句分類及語法說明&#xff0c;附帶典型用例&#xff1a;一、條件語句 1. if 語句 作用&#xff1a;根據條件執行不同代碼塊 語法&#xff1a; if [ 條件 ]; then# 條件為真時執行 elif [ 其他條件 ]; then# 其他條件為真時執行 else# 所有…

uni-app 選擇國家區號

uni-app選擇國家區號組件 hy-countryPicker 我們在做登錄注冊功能的時候&#xff0c;可能會遇到選擇區號來使用不同國家手機號來登錄或者注冊的功能。這里我就介紹下我這個uni-app中使用的選擇區號的組件&#xff0c;包含不同國家國旗圖標。 效果圖 別的不說&#xff0c;先來…

客戶端主機宕機,服務端如何處理 TCP 連接?詳解

文章目錄一、客戶端主機宕機后迅速重啟1、服務端有數據發送2、服務端開啟「保活」機制3、服務端既沒有數據發送&#xff0c;也沒有開啟「保活」機制二、客戶端主機宕機后一直沒有重啟1、服務端有數據發送2、服務端開啟「保活」機制3、服務端既沒有數據發送&#xff0c;也沒有開…

《大數據技術原理與應用》實驗報告五 熟悉 Hive 的基本操作

目 錄 一、實驗目的 二、實驗環境 三、數據集 四、實驗內容與完成情況 4.1 創建一個內部表 stocks&#xff0c;字段分隔符為英文逗號&#xff0c;表結構下所示。 4.2 創建一個外部分區表 dividends&#xff08;分區字段為 exchange 和symbol&#xff09;&#xff0c;字段…

【橘子分布式】Thrift RPC(編程篇)

一、簡介 之前我們研究了一下thrift的一些知識&#xff0c;我們知道他是一個rpc框架&#xff0c;他作為rpc自然是提供了客戶端到服務端的訪問以及兩端數據傳輸的消息序列化&#xff0c;消息的協議解析和傳輸&#xff0c;所以我們今天就來了解一下他是如何實現這些功能&#xff…

清理C盤--辦法

c盤經常爆紅1、命令行2、屬性3、臨時文件

Java-71 深入淺出 RPC Dubbo 上手 父工程配置編寫 附詳細POM與代碼

點一下關注吧&#xff01;&#xff01;&#xff01;非常感謝&#xff01;&#xff01;持續更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持續更新中&#xff01;&#xff08;長期更新&#xff09; AI煉丹日志-29 - 字節跳動 DeerFlow 深度研究框斜體樣式架 私有…

創客匠人:創始人 IP 打造的內核,藏在有效的精神成長里

當創始人 IP 成為企業增長的重要引擎&#xff0c;許多人急于尋找 “爆款公式”&#xff0c;卻忽略了一個更本質的問題&#xff1a;IP 的生命力&#xff0c;終究源于創始人的精神成長。創客匠人在深耕知識付費賽道的過程中&#xff0c;見證了無數案例&#xff1a;那些能持續實現…

GPT和MBR分區

GPT&#xff08;GUID分區表&#xff09;和MBR&#xff08;主引導記錄&#xff09;是兩種不同的磁盤分區表格式&#xff0c;用于定義硬盤上分區的布局、位置及啟動信息&#xff0c;二者在設計、功能和適用場景上有顯著差異。以下從多個維度詳細對比&#xff1a; 一、核心定義與起…

c#進階之數據結構(字符串篇)----String

1、String介紹首先我們得明白&#xff0c;string和String代表的實際上是同一個類型&#xff0c;string是C#中的關鍵字&#xff0c;代表String類型&#xff0c;因此我們直接來學習String類型。從官方的底層實現代碼可以看出&#xff0c;當前String類型實際上就是一個Char類型的聚…

快速排序遞歸和非遞歸方法的簡單介紹

基本思想為&#xff1a;任取待排序元素序列中 的某元素作為基準值&#xff0c;按照該排序碼將待排序集合分割成兩子序列&#xff0c;左子序列中所有元素均小于基準值&#xff0c;右 子序列中所有元素均大于基準值&#xff0c;然后最左右子序列重復該過程&#xff0c;直到所有元…

從零開始的云計算生活——第三十二天,四面楚歌,HAProxy負載均衡

目錄 一.HAProxy簡介 二.HAProxy特點和優點&#xff1a; 三.HAProxy保持會話的三種解決方法 四.HAProxy的balance 8種負載均衡算法 1&#xff09;RR&#xff08;Round Robin&#xff09; 2&#xff09;LC&#xff08;Least Connections&#xff09; 3&#xff09;SH&am…

策略模式及優化

策略模式&#xff08;Strategy Pattern&#xff09;是一種行為設計模式&#xff0c;其核心思想是將算法的定義與使用分離&#xff0c;使算法可以獨立于客戶端進行變化。它通過定義一系列算法&#xff0c;將每個算法封裝到獨立的類中&#xff0c;并使它們可以互相替換&#xff0…

微信小程序開發-桌面端和移動端UI表現不一致問題記錄

桌面端和移動端UI表現不一致零、引擎說明一、樣式不同1、text 單行&#xff1a;1.1 空格開發者工具不展示&#xff0c;手機/PC端正常1.2 正常展示省略號&#xff0c;需要2、點擊按鈕z-index: -1。webview - 桌面端不行&#xff0c; skyline - 移動端可以&#xff1b;3、其他說明…