數據結構基礎知識

排序

參考:https://www.bilibili.com/video/av38482633/?spm_id_from=trigger_reload

目錄

排序

插入排序

直接插入排序

折半排序

希爾排序

?

交換排序

冒泡排序

快速排序

?選擇排序

堆排序

流量單位計算

什么是計數排序

復雜度分析:

什么是基數排序?

復雜度分析(原始數列的規模是N,最大最小整數的差值是M)



插入排序

(有序插入,在有序序列中插入一個元素,保持序列有序,有序長度增加)

直接插入排序

——零號位為哨兵,i位要排序,順序查找j,依次比較哨兵,大則j往后移覆蓋,否則原地不動,i賦值j+1(比較后單向移動,不是交換)

?

折半排序

(循環比較mid=(low+height)/ 2? 與哨兵位置的大小,如果哨兵小,則到左半區查找,height=mid-1,否則右半區low=mid+1,直至low大于height,確定插入位置,然后將插入位置后面的所有對象都往后移動位置,將哨兵插入height+1)

希爾排序

(算法是一步一步來的,兩兩對比,相隔n個數據,然后模仿直接插入排序,完事兒后接著下一個數據接著同樣的以上來插入排序,最后一個間隔數值一定是1)

交換排序

冒泡排序

(基于簡單的交換思想,兩兩比較,大的沉底,前小后大,需要一個臨時空間暫存交換操作中的元素)

如果發現一次排序后沒有交換數據,那咋說明前排的數據都是有序的了,不需要再冒泡排序了

快速排序

(改進的交換排序,取中點放捎點,low、hign指針比較捎點大小分為左右區域,之后左右區域遞歸,不穩定)

?選擇排序

簡單選擇排序(選擇未排序里最小的并與第一個進行交換,之后依次步驟一樣)

?

?

?

?

堆排序

無序的話就按數組順序,由根往下排,并從第一個非葉子節點(n/2 | 0)開始堆調整,直至符合堆的定義


流量單位計算

流量單位G,M,K,B,是什么意思?
G, M, K, B, 都是數據或數據流量的單位符號。
其中,B 是字節的符號,字節 是數據或數據流量的基本單位。
它們之間的換算關系是:


什么是計數排序

先考一道算法題:

數組里有20個隨機整數,取值范圉從0到10,要求用最快的速度把這20個整數從小到大進行排序。有沒有比快速排序 0( nlogn)更快的排序方法呢?有的,就是用計數排序。

讓我們先來回顧一下咱們以前所學過的排序算法,無論是冒泡排序,還是快速排序等等,都是基于元素之間的比較來進行排序。有一種特殊的排序算法叫做【計數排序】,這種排序算法不是基于元素比較,而是利用數組下標來確定元素的正確位置。

基于上題中,整數的取值范圍只是從0-10之間,讓我們根據這個整數取值范圍,建立一個長度為11的數組。數組下標從0到10,元素初始值全為0。

假定20個隨機整數的值如下

9,3,5,4,9,1,2,7,8,1,3,6,5,3,4,0,10,9,7,9

如何給這些無序的隨機整數排序呢?

非常簡單,讓我們遍歷這個無序的隨機數列,每一個整數按照其值對號入座對應數組下標的元素進行加1操作

比如第一個整數是9,那么數組下標為9的元素加1:

第二個整數是3,那么數組下標為3的元素加1:

最終,數列遍歷完畢時,數組的狀態如下

數組每一個下標位置的值,代表了數列中對應整數出現的次數

有了這個“統計結果”,排序就很簡單了。直接遍歷數組,輸出數組元素的下標值,

元素的值是幾,就輸出幾次

0,1,1,2,3,3,3,4,4,5,5,6,7,7,8,9,9,9,9,10

顯然,這個輸出的數列已經是有序的了。

這就是計數排序的基本過程,它適用于一定范圍的整數排序。在取值范圍不是很大的情況下,它的性能甚至快過那些0(nlogn)的排序。

初步代碼如下:

這段代碼在一開頭補充了一 一個步驟,就是求得數列的最大整數值max。后面創建的統計數組countArray ,長度就是max+1 ,以此保證數組的最后-一個下標是max。

只以數列的最大值來決定統計數組的長度,其實并不嚴謹。而應該以最大值和最小值的差來作為數組的大小。不然會浪費空間。

我們不再以(輸入數列的最大值+1 )作為統計數組的長度,而是以(數列最大值和最小值的差+1 )作為統計數組的長度。同時,數列的最小值作為-一個偏移量,用于統計數組的對號入座。


以這個數列為例,統計數組的長度為99-90+1 = 10 , 偏移量等于數列的最小值90。對于第一個整數95 ,對應的統計數組下標是95-90 = 5 ,如圖所示:

此外,樸素版的計數排序只是簡單地按照統計數組的下標輸出了元素值,并沒有真正給原始數列進行排序。

如果是單純的給整數排序,這樣并沒有問題。但如果放在現實業務里,比如給學生的考試分數排序,遇到相同的分數就會分不清誰是誰。
?

給定一個學生的成績表,要求按成績從低到高排序,如果成績相同,則遵循原表固有順序。
那么,當我們填充統計數組以后,我們只知道有兩個成績并列95分的小伙伴,卻不知道哪一個是小紅,哪一一個是小綠:
我們需要稍微改變之前的邏輯,在填充完統計數組以后,對統計數組做一下變形。

統計數組從第二個元素開始,每一個元素都加上前面所有元素之和。

這樣相加的目的,是讓統計數組存儲的元素值,等于相應整數的最終排序位置。比如下標是9的元素值為5,代表原始數列的整數9,最終的排序是在第5位。

接下來,我們創建輸出數組sortedArray,長度和輸入數列一致。然后從后向前遍歷輸入數列:

第一步,我們遍歷成績表最后一行的小綠:

小綠是95分,我們找到countArray下標是5的元素,值是4,代表小綠的成績排名位置在第4位。(位置下標是3,因為成績最少的是第一位,而他下標的位置對應就是0)

同時,我們給countArray下標是5的元素值減1,從4變成3,,代表著下次再遇到95分的成績時,最終排名是第3。

這樣一來,同樣是95分的小紅和小綠就能夠清楚地排出順序了,也正因此,優化版本的計數排序屬于穩定排序

復雜度分析:

如果原始數列的規模是N,最大最小整數的差值是M,你說說計數排序的時間復雜度和空間復雜度是多少?
代碼第1, 2, 4步都涉及到遍歷原始數列,運算量都是N,第3步遍歷統計數列,運算量是M,所以總體運算量是3N+M,去掉系數,時間復雜度是0 (N+M)。
至于空間復雜度,如果不考慮結果數組,只考慮統計數組大小的話,空間復雜度是0 (M) 。

而計數排序存在它的局限性,主要表現在兩點:

1.當數列最大最小值差距過大時,并不適用計數排序。

比如給定20個隨機整數,范圍在0到1億之間,這時候如果使用計數排序,需要創建長度1億的數組。不但嚴重浪費空間,而且時間復雜度也隨之升高。

2.當數列元素不是整數,并不適用計數排序。

如果數列中的元素都是小數,比如25.213,或是0.00000001這樣子,則無法創建對應的統計數組。這樣顯然無法進行計數排序。

對于這些局限性,另一種線性時間排序算法做出了彌補,這種排序算法叫做[桶排序],我們后續將會講到。
參考:?什么是計數排序?


什么是基數排序?

讓我們接著來看兩個特殊的需求:

需求 A,為一組給定的手機號排序:

18914021920

13223132981

13566632981

13660891039

13361323035

........

........

按照計數排序的思路,我們要根據手機號的取值范圍,創建一個空數組。

可是,11 位手機號有多少種組合?恐怕要建立一個大得不可想象的數組,才能裝下所有可能出現的 11 位手機號!

需求 B,為一組英文單詞排序:

banana

apple

orange

peach

cherry

........

........

計數排序適合的場景是對整數做排序,如果遇到英文單詞,就無能為力了。

如何有效處理諸如手機號、英文單詞等復雜元素的排序呢?僅僅靠一次計數排序很難實現。

這時候,我們不妨把排序工作拆分成多個階段,每一個階段只根據一個字符進行計數排序,一共排序 k 輪(k 是元素長度)。

或許這樣的描述有些抽象,我們來舉一個例子

數組中有若干個字符串元素,每個字符串元素都是由三個英文字母組成:

bda,cfd,qwe,yui,abc,rrr,uee

如何將這些字符串按照字母順序排序呢?

由于每個字符串的長度是 3 個字符,我們可以把排序工作拆分成 3 輪:

第一輪:按照最低位字符排序。排序過程使用計數排序,把字母的 ascii 碼對應到數組下標,第一輪排序結果如下:

第二輪:在第一輪排序結果的基礎上,按照第二位字符排序。

需要注意的是,這里使用的計數排序必須是穩定排序,這樣才能保證第一輪排出的先后順序在第二輪還能繼續保持。

比如在第一輪排序后,元素 uue 在元素 yui 之前。那么第二輪排序時,兩者的第二位字符雖然同樣是 u,但先后順序萬萬不能變,否則第一輪排序就白做了。

第三輪:在第二輪排序結果的基礎上,按照最高位字符排序。

如此一來,這些字符串的順序就排好了。

像這樣把字符串元素按位拆分,每一位進行一次計數排序的算法,就是基數排序(Radix Sort)。

基數排序既可以從高位優先進行排序(Most Significant Digit first,簡稱MSD),也可以從低位優先進行排序(Least Significant Digit first,簡稱LSD)。

不過,如果排序的字符串長度不規則呢?這個問題不難解決。我們以最長的字符串為準,其他度不足的字符串,在末尾補0即可。在排序時,我們把字符 0 當做是比 a 更小的字符,排序結果如下:

ape000

apple0

banana

he0000

orange

代碼如下:

備注:

ASCII ((American Standard Code for Information Interchange): 美國信息交換標準代碼)是基于拉丁字母的一套電腦編碼系統,主要用于顯示現代英語和其他西歐語言。它是最通用的信息交換標準,并等同于國際標準ISO/IEC 646。ASCII到目前為止共定義了128個字符??。

空字符的ASCII碼如下:

這段代碼基于一個大循環來實現,循環進行 k 次,k 就是數組中最長字符串元素的字符數。

復雜度分析(原始數列的規模是N,最大最小整數的差值是M

原本計數排序的時間復雜度是0 (n+m),而基數排序總共執行了k次計數排序,所以時間復雜度是0 (k (n+m)),其中k是字符串的最大長度, m是字符范圍。

至于空間復雜度,由于基數排序的輔助數組是反復重用的,所以基數排序的空間復雜度和計數排序-樣,都是0(n+m),其中m是字符的取值范圍大小。

參考:什么是基數排序?


?

?

?

?

?

?

?

?

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

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

相關文章

linux中安裝軟件,查看、卸載已安裝軟件方法

各種主流Linux發行版都采用了某種形式的包管理系統(PMS)來控制軟件和庫的安裝。 軟件包存儲在服務器上,可以利用本地Linux系統上的PMS工具通過互聯網訪問。這些服務器稱為倉庫。 由于Linux發行版眾多,目前還沒有統一的PMS標準工具。 這里分別…

html5 --- 使用javascript腳本控制媒體播放

H5中的標簽(<audio…/> 和 <video…/>)對于JS中的HTMLAudioElement對象和HTMLVideoElement對象 對象有以下幾個方法: play(): 播放 pause(): 暫停播放 load(): 重新裝載音頻、視頻 canPlayType(type): 判斷該元素可播放type類型的音頻、視頻 下面是一個簡單的音樂…

在js中if條件為null/undefined/0/NaN/表達式時,統統被解釋為false,此外均為true

Boolean 表達式 一個值為 true 或者 false 的表達式。如果需要&#xff0c;非 Boolean 表達式也可以被轉換為 Boolean 值&#xff0c;但是要遵循下列規則&#xff1a; 所有的對象都被當作 true。當且僅當字符串為空時&#xff0c;該字符串被當作 false。null 和 undefined 被當…

ES6專題——整理自阮一峰老師的ECMAScript 6入門

這里我僅僅是記錄了那些我認為值得注意的ES6知識點&#xff0c;詳細版請挪步https://es6.ruanyifeng.com/#docs/let let和const命令 let聲明的變量只在它所在的代碼塊有效。 var a []; for (let i 0; i < 10; i) {a[i] function () {console.log(i);}; } a[6](); // 6 …

開發測試比

1.服務器已經開啟了CORS跨域支持 瀏覽器有同源策略限制&#xff1a;協議、域名、端口號其中無法向非同源地址發送ajax請求 跨域解決方法&#xff1a;JSONP&#xff08;只支持get不支持post&#xff09;&#xff0c;不是ajax 凡是有src屬性的標簽都有跨域能力 前端定義一個處理…

map函數用法詳解

map函數是Python內置的高階函數&#xff0c;它是一個典型的函數式編程例子。它的參數為: 一個函數function、一個或多個sequence。通過把函數function依次作用在sequence的每個元素上&#xff0c;得到一個新的sequence并返回。注意&#xff1a;map函數不改變原有的sequence&…

2018暑假集訓測試六總結

拿到試題沒幾分鐘&#xff0c;就有人說會做T1QAQ。第一題感覺似曾相識&#xff0c;其實不同。梳理出本質后發現有兩個限制&#xff0c;便想用枚舉遞推來快速求解&#xff0c;發現要么是不會推&#xff0c;要么是時空超限&#xff0c;不會優化。期間也想過通過離線做&#xff0c…

css3 --- 使用媒體查詢進行響應式布局

css3引入media,可以根據設備特性進行不同的布局, 本文展示的是根據不同屏幕的寬度進行不同的布局,代碼如下: <!DOCTYPE html> <html> <head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title> 針…

node項目正常啟動后不能訪問(防火墻未放行端口)

今天打開個人站點&#xff0c;發現登陸不了&#xff0c;原以為是pm2的問題&#xff0c;先停了pm2用node app.js的方式運行后端代碼&#xff0c;項目能正常啟動但是依然不能登陸。 1 檢查ecs的安全組規則&#xff0c;node項目端口3000、8888是否放行 2 確認node正常運行 輸入…

[轉載]dbms_lob用法小結

http://blog.sina.com.cn/s/blog_713978a50100prkt.html CLOB里存的是2進制 判定長度 DBMS_LOB.GETLENGTH(col1)獲取文本 DBMS_LOB.SUBSTR(col1,n,pos)DBMS_LOB.SUBSTR(col1,10,1)表示從第1個字節開始取出10個字節 DBMS_LOB.SUBSTR(CLOB_VAR,32767)表示截取CLOB變量保存的全…

javascript --- 利用節點關系訪問HTML元素

<input type"button" value"父節點"onclick"change(curTarget.parentNode);" /><input type"button" value"第一個"onclick"change(curTarget.parentNode.firstChild.nextSibling);" /><input typ…

mysql中列屬性

mysql列屬性包括&#xff1a;NULL 、default、comment、primary key、unique key 一、NULL定義方式&#xff1a;NULL&#xff08;默認&#xff09;  NOT NULL 空屬性有2個值&#xff0c;mysql數據庫默認字段都是為null的&#xff0c;但是在實際開發過程中&#xff0c;盡可能保…

前端知識點整理(三)不定時更新~

目錄 一、移動端跨平臺開發方案 Hybrid App React Native Weex Flutter PWA &#xff08;Progressive Web App&#xff09; 小程序 Cordova html5 組件和模塊的區別 組件化 模塊化 前端代碼規范 前端工程化理解 網站性能監測與優化策略 1.網絡傳輸性能優化 頁…

前端試題(一)

2020-03-28 金卡智能 *1. 腳手架 vue-cli現在用的什么版本&#xff0c;2版本了解多少&#xff0c;2 3有什么區別 絕對路徑與相對路徑 ./ 當前路徑 …/父路徑 / 絕對路徑 某文件里引用其他路徑下的資源&#xff1a; 判斷該文件所在文件夾與其他資源路徑間的關系。 什么&#…

html5 --- 利用localStorage進行本地存儲

首先做一個提交到本地存儲的表單及一個用來顯示本地localStorage信息的表格…代碼如下: <h2> 本地存儲用 </h2>標題: <input id"title" name"title" type"text" size"60" style"margin-left:32px;margin-bottom:…

Tomcat啟動阻塞變慢

Tomcat 熵池阻塞變慢詳解 Tomcat 啟動很慢&#xff0c;且日志上無任何錯誤&#xff0c;在日志中查看到如下信息&#xff1a; Log4j:[2015-10-29 15:47:11] INFO ReadProperty:172 - Loading properties file from class path resource [resources/jdbc.properties] Log4j:[201…

項目總結

123轉載于:https://www.cnblogs.com/kehuaihan/p/9284858.html

前端試題(二)

1. 數組方法、reduce()的第二個參數 reduce() MDN文檔 accumulator 累計器currentValue 當前值currentIndex 當前索引array 數組 在沒有初始值的空數組上調用 reduce 將報錯&#xff08;如果有initialValue不報錯&#xff09;。回調函數第一次執行時&#xff0c;accumulator…

項目中遇到問題的解決方法合集

以下內容主要是為了方便記錄自己在工作中遇到的項目問題搜尋到的解決方法&#xff0c;肯定方法不唯一&#xff0c;這里只是給出解決了我的問題的方法&#xff0c;大家走過路過隨便瞧瞧較好啦嘻嘻 1、使用vue/cli 4.x 創建vue項目時使用iconfont 圖標無法顯示——前者版本問題 …