排序-插入排序與選擇排序

插入排序

基本思想


把待排序的記錄按其關鍵碼值的大小逐個插入到一個已經排好序的有序序列中,直到所有的記錄插入完為止,得到一個新的有序序列 。

打撲克牌整理手牌用的就是插入排序的思想

代碼實現


void InsertSort(int* a, int n)
{
?? ?assert(a);
?? ?for (int i = 0; i < n - 1; i++)//將一個數組中所有元素升序
?? ?{ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//,這里必須是n-1,不然后面數組會越界
?? ??? ?int end=i;
?? ??? ?int x=a[end+1];//x始終指向end下一個位置的值
?? ??? ?while (end >= 0)//每趟插入最多挪動end-1個數據
?? ??? ?{
?? ??? ??? ?if (a[end] > x)//x前一個數大于x,就將數據往后移一格
?? ??? ??? ?{
?? ??? ??? ??? ?a[end + 1] = a[end];//這里數組的值會往后覆蓋
?? ??? ??? ??? ? ? ? ? ? ? ? ? ? ? ?//但是沒關系,我們已經將a[end+1]的值保存在x當中了
?? ??? ??? ??? ?end--;
?? ??? ??? ?}
?? ??? ??? ?else
?? ??? ??? ?{
?? ??? ??? ??? ?break;//跳出里面的while循環
?? ??? ??? ?}
?? ??? ?}
?? ??? ?a[end + 1] = x;
?? ?}
}

?

特性總結

1. 元素集合越接近有序,直接插入排序算法的時間效率越高
2. 時間復雜度:O(N^2)
3. 空間復雜度:O(1),它是一種穩定的排序算法
4. 穩定性:穩定

選擇排序

基本思想

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

就像小學生排隊一樣,讓最矮的那個站到第一排,然后讓第二矮的占到第二排,以此類推

代碼實現

void SelectSort(int* a, int n)
{
?? ?int begain = 0;
?? ?int end = n - 1;
?? ?while (begain < end)
?? ?{
?? ??? ?int maxi = begain;//初始化最值
?? ??? ?int mini = begain;
?? ??? ?for (int i = begain; i <= end; i++)
?? ??? ?{
?? ??? ??? ?if (a[i] < a[mini])
?? ??? ??? ?{
?? ??? ??? ??? ?mini = i;//記錄下標,否則會有數據被覆蓋的問題
?? ??? ??? ?}
?? ??? ??? ?if (a[i] > a[maxi])
?? ??? ??? ?{
?? ??? ??? ??? ?maxi = i;
?? ??? ??? ?}
?? ??? ?}
?? ??? ?swap(&a[begain], &a[mini]);//將最大最小值交換
?? ??? ?swap(&a[end], &a[maxi]);
?? ??? ?begain++;//數組范圍往中間縮小
?? ??? ?end--;
?? ?}
}

?

代碼優化

上述思想是單向的,我們可以讓最高的和最矮的同時排序,就可以優化一下,實現雙向排序


void SelectSort(int* a, int n)
{
?? ?int begain = 0;
?? ?int end = n - 1;
?? ?while (begain < end)
?? ?{
?? ??? ?int maxi = begain;
?? ??? ?int mini = begain;
?? ??? ?for (int i = begain; i <=end; i++)
?? ??? ?{
?? ??? ??? ?if (a[i] < a[mini])
?? ??? ??? ?{
?? ??? ??? ??? ?mini = i;//記錄下標,否則會有數據被覆蓋的問題
?? ??? ??? ?}
?? ??? ??? ?if (a[i] > a[maxi])
?? ??? ??? ?{
?? ??? ??? ??? ?maxi = i;
?? ??? ??? ?}
?? ??? ?}
?? ??? ?swap(&a[begain], &a[mini]);
?? ??? ?if (maxi == begain)//當最大值為begain時,交換最小值和開頭元素后,maxi指向的值不再是最大值了.
?? ??? ?{
?? ??? ??? ?maxi = mini;
?? ??? ?}
?? ??? ?swap(&a[end], &a[maxi]);
?? ??? ?begain++;
?? ??? ?end--;
?? ?}
}

?

特性總結

1. 直接選擇排序思考非常好理解,但是效率不是很好。實際中很少使用
2. 時間復雜度:O(N^2)
3. 空間復雜度:O(1)
4. 穩定性:不穩定

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

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

相關文章

C語言自定義類型

在C語言中&#xff0c;自定義類型可以通過typedef關鍵字來實現。typedef用于為現有的數據類型創建新的名稱&#xff08;別名&#xff09;&#xff0c;使代碼更清晰易讀。自定義類型的一個常見用途是簡化復雜的類型聲明&#xff0c;特別是在使用結構體、枚舉和函數指針時。 使用…

52、有邊數限制的最短路

有邊數限制的最短路 題目描述 給定一個n個點m條邊的有向圖&#xff0c;圖中可能存在重邊和自環&#xff0c; 邊權可能為負數。 請你求出從1號點到n號點的最多經過k條邊的最短距離&#xff0c;如果無法從1號點走到n號點&#xff0c;輸出impossible。 注意&#xff1a;圖中可…

查看 WSL2 (Windows Subsystem for Linux 2) IP 地址

查看 WSL2 [Windows Subsystem for Linux 2] IP 地址 1. ipconfig2. ping $(hostname).local3. cat /etc/resolv.conf4. ip route show5. ip addrReferences 1. ipconfig Windows 系統上與 WSL2 (Windows Subsystem for Linux 2) 接口的地址 172.31.32.1。 Microsoft Windows…

米爾MYC-Y6ULX-V2開發板測評記錄

文章目錄 1、板子上手體驗2、板載硬件3、系統信息4、 驅動測試5、編譯linux三大件7、攝像頭測試9、總結 1、板子上手體驗 首先非常感謝芯查查給了這樣一個機會來測評這樣一款性能十分強大的開發板&#xff0c;我拿到手的是MYC-Y6ULX-V2核心板及開發板&#xff0c;這塊板子具有…

STM32HAL-最簡單的長、短、多擊按鍵框架

目錄 概述 一、開發環境 二、STM32CubeMx配置 三、編碼 四、運行結果 五、總結 概述 本文章使用最簡單的寫法實現長、短、多擊按鍵框架&#xff0c;非常適合移植各類型單片機&#xff0c;特別是資源少的芯片上。接下來將在stm32單片機上實現&#xff0c;只需占用1個定時…

動態控制eBPF程序加載:檢查 Tracepoint、Kprobe是否存在

前言 在 eBPF 程序開發中&#xff0c;確保程序能夠在各種不同的系統配置中兼容運行是至關重要的。本文將詳細介紹一個方案&#xff0c;通過動態檢查Tracepoint、Kprobe是否存在&#xff0c;并結合libbpf的API接口控制 eBPF 程序的加載。這種方法不僅可以提升程序的靈活性&…

jwt 實現用戶登錄完整java

登錄校驗邏輯 用戶登錄的校驗邏輯分為三個主要步驟&#xff0c;分別是校驗驗證碼&#xff0c;校驗用戶狀態和校驗密碼&#xff0c;具體邏輯如下 前端發送username、password、captchaKey、captchaCode請求登錄。判斷captchaCode是否為空&#xff0c;若為空&#xff0c;則直接…

AWS聯網和內容分發服務

概況 VPC Amazon Virtual Private Cloud (Amazon VPC) 讓您能夠全面地控制自己的虛擬網絡環境&#xff0c;包括資源放置、連接性和安全性。首先在 AWS 服務控制臺中設置 VPC。然后&#xff0c;向其中添加資源&#xff0c;例如 Amazon Elastic Compute Cloud (EC2) 和 Amazon …

數據分析必備:一步步教你如何用Pandas做數據分析(15)

1、Pandas 數據丟失 Pandas 數據丟失的操作實例 在現實生活中&#xff0c;數據丟失始終是一個問題。機器學習和數據挖掘等領域在模型預測的準確性方面面臨嚴重問題&#xff0c;因為缺少值會導致數據質量較差。在這些領域中&#xff0c;缺失值處理是使模型更準確和有效的主要重…

定個小目標之每天刷LeetCode熱題(7)

今天這道題是道簡單題&#xff0c;使用雙指針進行迭代即可&#xff0c;畫了下草圖如下 代碼如下 class Solution {public ListNode reverseList(ListNode head) {if (head null || head.next null) {return head;}ListNode p head, q head.next, temp null;while (q ! nu…

【Python如何將EXCEL拆分】

文章目錄 Python將一個EXCEL表拆分多個excel表Python將一個EXCEL表中一個sheet拆分多個sheet表 Python將一個EXCEL表拆分多個excel表 在Python中&#xff0c;你可以使用pandas庫來讀取Excel文件&#xff0c;并將一個大的Excel表格&#xff08;工作表&#xff09;拆分成多個單獨…

Writerside生成在線幫助文檔或用戶手冊軟件基礎使用教程

Writerside是JetBrains出的一個技術文檔工具&#xff0c;既能用在JetBrains IDE上&#xff0c;也能單獨用。它能幫你輕松寫、建、測、發技術文檔&#xff0c;像產品說明、API參考、開發指南等都能搞定。 特點&#xff1a; 文檔即代碼&#xff1a;它讓你像管代碼一樣管文檔&…

【大數據Spark】常見面試題(萬字!建議收藏)

文章目錄 入門級中等難度中高級難度數據傾斜解決方法 入門級 什么是Apache Spark&#xff1f;它與傳統的MapReduce有何不同&#xff1f; Apache Spark是一個開源的分布式計算系統&#xff0c;它提供了高效的數據處理和分析能力。與傳統的MapReduce相比&#xff0c;Spark具有更快…

海光CPU:國產信創的“芯“動力解讀

國產信創CPU-海光CPU CPU&#xff1a;信創根基&#xff0c;國之重器 國產CPU形成三大陣營&#xff1a;自主架構、x86及ARM。自主陣營中&#xff0c;龍芯和申威以LoongArch和SW-64為基石&#xff1b;ARM陣營由鯤鵬、飛騰主導&#xff0c;依托ARM授權研發處理器&#xff1b;x86陣…

紅帽練習 之邏輯卷 pv lv gv

邏輯卷習題 1 在/dev/sdb 存儲設備上創建物理設備分區 創建2個大小各為256MB的分區 并設置為linux lvm類型 使用first 和second 作為這些分區的名稱 parted /dev/sdb mklabel gpt parted /dev/sdb primary mkpart first 1M 256M parted /dev/sdb set 1 …

【Linux|數據恢復】extundelete和ext4magic數據恢復工具使用

環境&#xff1a;Centos7.6_x86 一、extundelete工具 1、extundelete介紹 Extundelete 是一個數據恢復工具&#xff0c;用于從 ext3 或 ext4 分區中恢復刪除文件。根據官網0.2.4版本介紹是支持ext4&#xff0c;但實際上使用發現ext4格式有些問題&#xff0c;會報以下錯誤&…

動態SQL IF語句

IF語句學習 第一種寫法(標準) 我們先來看以下標準寫法: select * from .. <where> <if test""> and ....... <if test""> and ....... <where> 我們用了一個where標簽 , 內嵌if語句 第二種寫法: 這是第二種寫法:不用where標…

大降分!重郵計算機專碩復試線大降50分!重慶郵電計算機考研考情分析!

重慶郵電大學&#xff08;Chongqing University of Posts and Telecommunications&#xff09;簡稱重郵&#xff0c;坐落于中國重慶市主城區南山風景區內&#xff0c;是中華人民共和國工業和信息化部與重慶市人民政府共建的教學研究型大學&#xff0c;入選國家“中西部高校基礎…

一篇文章搞懂Go語言切片底層原理(圖文并茂+舉例講解)

1. 切片和數組的底層關系 Go語言切片的數據結構是一個結構體&#xff1a; type slice struct {array unsafe.Pointerlen intcap int }Go語言中切片的內部結構包含地址、大小和容量。將數組比喻成一個蛋糕&#xff0c;那么切片就是需要切的那一塊&#xff0c;而那一塊的的…

c++學生管理系統

想要實現的功能 1&#xff0c;可以增加學生的信息&#xff0c;包括&#xff08;姓名&#xff0c;學號,c成績&#xff0c;高數成績&#xff0c;英語成績&#xff09; 2&#xff0c;可以刪除學生信息 3&#xff0c;修改學生信息 4&#xff0c;顯示所有學生信息 5&#xff0c…