【數據結構】——排序篇(上)

前言:前面我們已經學過了許許多多的排序方法,如冒泡排序,選擇排序,堆排序等等,那么我們就來將排序的方法總結一下。

在這里插入圖片描述

我們的排序方法包括以下幾種,而快速排序和歸并排序我們后面進行詳細的講解。
在這里插入圖片描述

直接插入排序:

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

直接插入排序顧名思義把待排序的記錄按其關鍵碼值的大小逐個插入到一個已經排好序的有序序列中,直到所有的記錄插入完為止,得到一個新的有序序列 。
我們用一個變量來保存我們插入數據的原數組中的后一個數據,我們排的是降序,那么我們的后一個數據比前一個數據大的話,我們的后一個數據tmp就被前一個覆蓋,直到end<0或者我們的后一個數據比前一個小我們就跳出循環,我們保存的數據就等于我們跳出循環的這個數。

希爾排序:

void ShellSort(int* a, int n)
{int gap = n;// gap > 1時是預排序,目的讓他接近有序// gap == 1是直接插入排序,目的是讓他有序while (gap > 1){//gap = gap / 2;gap = gap / 3 + 1;for (int i = 0; i < n - gap; ++i){int end = i;int tmp = a[end + gap];while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}

希爾排序的思想是先選定一個整數,把待排序文件中所有記錄分成個組,所有距離為的記錄分在同一組內,并對每一組內的記錄進行排序。然后,取,重復上述分組和排序的工作。當到達=1時,所有記錄在統一組內排好序。
在這里插入圖片描述
我們利用希爾排序法可以將數組分成gap組,gap是我們沒組兩個樹之間的間隔, 如果我們的gap是3時,我們就分成了三組,當gap等于0時,我們的紅色這組就進行插入排序,當gap為1時,我們藍色這組就進行插入排序,當gap為2時,我們綠色這組就進行插入排序,這樣我們將完成了第一趟排序。我們要完成整個排序的話,我們就得在嵌套一層循環,我們的gap大于1時就進行預排序,我們的gap為1時就是最后一趟排序,我們的gap無論是幾,只要最后gap的值為1我們就完成了排序。

選擇排序:

void Swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}
void SelectSort(int* a, int n)
{int begin = 0, end = n - 1;while (begin < end){int mini = begin, maxi = begin;for (int i = begin + 1; i <= end; ++i){if (a[i] < a[mini]){mini = i;}if (a[i] > a[maxi]){maxi = i;}}Swap(&a[begin], &a[mini]);if (maxi == begin){maxi = mini;}Swap(&a[end], &a[maxi]);++begin;--end;}
}

我們這里用兩個變量來保存小數和大數的下標,我們的后面循環里的數如果比下標為0的數小的話,小數據mini的下標就是我們比第一個數據小的數據i的坐標,我們排序排的是升序,我們的第一個數就是應該是下標為mini的數據,所以我們將就下標為mini的數據與第一個數據交換,們的后面循環里的數如果比下標為0的數大的話就是存放大數據,下標為maxi,我們就用最后一個數據和下標為maxi的數據交換。如果我們最后循環退出的時候我們的maxi還等于begin,那么我們的下標為begin的數據就是最小的。

堆排序:

void Swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}
void AdjustDown(int* a, int size, int parent)
{int child = parent * 2 + 1;while (child < size){// 假設左孩子小,如果解設錯了,更新一下if (child + 1 < size && a[child + 1] > a[child]){++child;}if (a[child] > a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}// 升序
void HeapSort(int* a, int n)
{// O(N)// 建大堆for (int i = (n - 1 - 1) / 2; i >= 0; --i){AdjustDown(a, n, i);}// O(N*logN)int end = n - 1;while (end > 0){Swap(&a[0], &a[end]);AdjustDown(a, end, 0);--end;}
}

我們要排升序,所以我們需要建立一個大堆,大堆的特點是子節點大于根節點,我們通過不斷將根節點和最后一個節點交換,進行向下調整,我們的數據大的節點就會沉在底下,而小的節點就會浮在上面,最后我們通過遍歷就能夠輸出升序的數據。

冒泡排序:

void Swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}
void BubbleSort(int* a, int n)
{for (int j = 0; j < n; j++){bool exchange = false;for (int i = 1; i < n - j; i++){if (a[i - 1] > a[i]){Swap(&a[i - 1], &a[i]);exchange = true;}}if (exchange == false)break;}

冒泡排序我們很早之前就已經了解過了,我這里就不多贅述了,如果有疑問的話就看我之前的文章
https://blog.csdn.net/Lehjy/article/details/132266676,相信以你的聰明才智一定可以完美的解決。

最后感謝大家一如既往的支持!謝謝大家!

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

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

相關文章

Qt實現二維碼生成和識別

一、簡介 QZxing開源庫: 生成和識別條碼和二維碼 下載地址&#xff1a;https://gitcode.com/mirrors/ftylitak/qzxing/tree/master 二、編譯與使用 1.下載并解壓&#xff0c;解壓之后如圖所示 2.編譯 打開src目錄下的QZXing.pro&#xff0c;選擇合適的編譯器進行編譯 最后生…

util.js

一、util.js是什么&#xff1f; 1、util.js是Node.js提供的一個工具庫&#xff0c;主要用于輔助實現JavaScript代碼的通用功能。 2、除了Node.js中內置的模塊外&#xff0c;util.js是Node.js中最核心的模塊之一。 3、通過util.js&#xff0c;開發者可以輕松實現JavaScript常…

Unity 資源管理之StreamingAssets

StreamingAssets也是Unity中特殊的文件夾&#xff0c;用于存放運行時可以直接訪問的資源。StreamingAssets一般存放數據或配置文件、圖片、視頻資源等。 StreamingAssets的文件路徑可以通過Application.streamingAssetsPath來獲取。 加載或訪問使用WWW類或UnityWebRequest類。…

MIT6S081-Lab2總結

大家好&#xff0c;我叫徐錦桐&#xff0c;個人博客地址為www.xujintong.com&#xff0c;github地址為https://github.com/xjintong。平時記錄一下學習計算機過程中獲取的知識&#xff0c;還有日常折騰的經驗&#xff0c;歡迎大家訪問。 Lab2就是了解一下xv6的系統調用流程&…

Java - Synchronized的鎖升級之路

Synchronized鎖 Synchronized在Java JVM里的實現是基于進入和退出Monitor對象來實現方法同步和代碼塊同步的 monitor enter指令是在編譯后插入到同步代碼塊的開始位置 而monitor exit是插入到方法結束處和異常處 JVM要保證每個monitor enter必須有對應的monitor exit與之配對。…

解決服務端渲染程序SSR運行時報錯: ReferenceError: document is not defined

現象&#xff1a; 原因&#xff1a; 該錯誤表明在服務端渲染 (SSR) 過程中&#xff0c;有一些代碼嘗試在沒有瀏覽器環境的情況下執行與瀏覽器相關的操作。這在服務端渲染期間是一個常見的問題&#xff0c;因為在服務端渲染期間是沒有瀏覽器 API。 解決辦法&#xff1a; 1. 修…

bat腳本之while

在批處理&#xff08;BAT&#xff09;腳本中&#xff0c;while循環是一種常用的控制流結構&#xff0c;用于在滿足特定條件的情況下重復執行一段代碼。 while循環的基本語法如下&#xff1a; while [ condition ] do command1 command2 ... commandN done這里的 cond…

【2023傳智杯-新增場次】第六屆傳智杯程序設計挑戰賽AB組-DEF題復盤解題分析詳解【JavaPythonC++解題筆記】

本文僅為【2023傳智杯-第二場】第六屆傳智杯程序設計挑戰賽-題目解題分析詳解的解題個人筆記,個人解題分析記錄。 本文包含:第六屆傳智杯程序設計挑戰賽題目、解題思路分析、解題代碼、解題代碼詳解 文章目錄 一.前言二.賽題題目D題題目-E題題目-F題題目-二.賽題題解D題題解-…

深入理解Sentinel系列-1.初識Sentinel

&#x1f44f;作者簡介&#xff1a;大家好&#xff0c;我是愛吃芝士的土豆倪&#xff0c;24屆校招生Java選手&#xff0c;很高興認識大家&#x1f4d5;系列專欄&#xff1a;Spring源碼、JUC源碼、Kafka原理、分布式技術原理&#x1f525;如果感覺博主的文章還不錯的話&#xff…

待做-待補充-每個節點做事,時間,以及與角度的關系

文章目錄 待定內容紅黑樹應用場景限制什么是二叉樹遍歷遞歸遍歷1.前序遍歷 進入節點時2.中序遍歷 遍歷完左子樹回到節點。此操作需要等到所有左樹節點做完后才會做3.后序遍歷 遍歷完左右子樹回到節點。左右子樹的所有節點都做完操作后&#xff0c;回到當前節點才會做此操作 …

如何搭建自己的直播電商系統?

當下&#xff0c;傳統的圖文電商模式已經走向沒落&#xff0c;視頻電商備受追捧。抖音、快手、小紅書、京東、淘寶、拼多多都在發力直播電商業務&#xff0c;尤其是以抖音為首的直播電商備受用戶歡迎&#xff0c;它具有實時直播和強互動的特點&#xff0c;是傳統電商所不具備的…

<HarmonyOS第一課>保存應用數據【課后考核】

【習題】保存應用數據 判斷題 首選項是關系型數據庫。 錯誤(False) 應用中涉及到Student信息&#xff0c;如包含姓名&#xff0c;性別&#xff0c;年齡&#xff0c;身高等信息可以用首選項來存儲。 錯誤(False) 同一應用或進程中每個文件僅存在一個Preferences實例。 正確(T…

最長子串問題(LCS)--動態規劃解法

題目描述&#xff1a; 如果Z既是X的子串&#xff0c;又是Y的子串&#xff0c;則稱Z為X和Y的公共子串。 如果給定X、Y&#xff0c;求出最長Z及其長度。 注意&#xff1a;這里求的不是子序列&#xff0c;兩者的意思并不相同。子串要求連續&#xff0c;子序列并不需要。 如果想…

simulinkveristandlabview聯合仿真環境搭建

目錄 開篇廢話 軟件版本 明確需求 軟件安裝 matlab2020a veristand2020 R4 VS2017 VS2010 軟件安裝驗證 軟件資源分享 開篇廢話 推免之后接到的第一個讓人難繃的活&#xff0c;網上開源的軟件資料和成功的案例很少&#xff0c;查來查去就那么幾篇&#xff0c;而且版本…

SpringData

1.為什么要學習SpringData&#xff1f; 是因為對數據存儲的框架太多了&#xff0c;全部都要學習成本比較高&#xff0c;SpringData對這些數據存儲層做了一個統一&#xff0c;學習成本大大降低。

SQL命令---修改字段的數據類型

介紹 使用sql語句修改字段的數據類型。 命令 alter table 表明 modify 字段名 數據類型;例子 有一張a表&#xff0c;表里有一個id字段&#xff0c;長度為11。使用命令將長度修改為12 下面使用命令進行修改&#xff1a; alter table a modify id int(12) NOT NULL;下面使修…

stm32使用多串口不輸出無反應的問題(usart1、usart2)

在使用stm32c8t6單片機時&#xff0c;由于需要使用兩個串口usart1 、usart2。usart1用作程序燒錄、調試作用&#xff0c;串口2用于與其它模塊進行通信。 使用串口1時&#xff0c;正常工作&#xff0c;使用串口2時&#xff0c;無反應。查閱了相關資料串口2在PA2\PA3 引腳上。RX…

[僅供學習,禁止用于違法]編寫一個程序來手動設置Windows的全局代理開或關,實現對所有網絡請求攔截和數據包捕獲(抓包或VPN的應用)

文章目錄 介紹一、實現原理二、通過注冊表設置代理2.1 開啟代理2.2 關閉代理2.3 添加代理地址2.4 刪除代理設置信息 三、代碼實戰3.1 程序控制代理操作控制3.1.1 開啟全局代理3.1.2 添加代理地址3.1.3 關閉代理開關3.1.4 刪除代理信息 3.2 攔截所有請求 介紹 有一天突發奇想&am…

在git使用SSH密鑰進行github身份認證學習筆記

1.生成ssh密鑰對 官網文檔&#xff1a;Https://docs.github.com/zh/authentication&#xff08;本節內容對應的官方文檔&#xff0c;不清晰的地方可參考此內容&#xff09; 首先&#xff0c;啟動我們的git bush&#xff08;在桌面右鍵&#xff0c;點擊 Git Bush Here &#xf…

iOS_制作 cocopods庫

文章目錄 1.創建項目2.配置項目3.發布 1.創建項目 在 github 上創建倉庫&#xff0c;克隆到本地&#xff1a; git clone https://github.com/mxh-mo/MOOXXX.git在項目目錄下執行&#xff1a; pod lib create <庫名稱>進行一些配置的選擇&#xff1a; # 希望在那個平臺…