在算法和開發(fā)的面試中,經(jīng)常會(huì)讓你口述一下排序的某個(gè)算法的原理和思路,我整理了一下這八大排序的口述思路。
如果需要詳細(xì)版本,包含思路、解析、代碼、時(shí)間復(fù)雜度、空間復(fù)雜度、穩(wěn)定性分析以及排序之間的詳細(xì)比較的內(nèi)容,請(qǐng)看這篇文章:
Python實(shí)現(xiàn)八大排序:排序特點(diǎn)/原理解析/思路解析/代碼解析/考點(diǎn)解析/面試考試點(diǎn)睛(冒泡排序/選擇排序/插入排序/希爾排序/歸并排序/快速排序/堆排序/基數(shù)排序)_python排序從大到小_會(huì)害羞的楊卓越的博客-CSDN博客
1、冒泡排序
- 第一個(gè)數(shù)和第二個(gè)數(shù)比較,第一個(gè)數(shù)大則交換
- 第二個(gè)數(shù)和第三個(gè)數(shù)交換,第三個(gè)數(shù)大則交換
- 一直到最后一個(gè)數(shù),則此時(shí)最后一個(gè)數(shù)為最大,最后一個(gè)數(shù)進(jìn)入了已排序序列
- 重復(fù)1-3步驟,繼續(xù)對(duì)前面n-1個(gè)數(shù)進(jìn)行排序,完成排序
2、選擇排序
- 第一步:選擇第一個(gè)數(shù)的索引為最小數(shù)的索引
- 第二步:對(duì)剩下n-1個(gè)數(shù)進(jìn)行遍歷比較,遇到比當(dāng)前最小索引數(shù)小的數(shù),則更新最小索引
- 第三步:將新的最小索引數(shù)與第一個(gè)數(shù)進(jìn)行交換,第一個(gè)數(shù)進(jìn)入已排序序列(如果最小索引沒有發(fā)生過變化,則不需要交換)
- 第四步:重復(fù)1-3步驟,繼續(xù)對(duì)后面n-1個(gè)數(shù)進(jìn)行排序,完成排序
3、插入排序
- 將第一個(gè)數(shù)與第二個(gè)數(shù)比較,第一個(gè)數(shù)大則交換,前面兩個(gè)數(shù)進(jìn)入已排序序列,第三個(gè)數(shù)為未排序序列的第一個(gè)數(shù)
- 未排序序列的數(shù)與已排序序列的所有數(shù)進(jìn)行比較,將當(dāng)前未排序序列的數(shù)插入到已排序序列的數(shù)
- 重復(fù)這個(gè)過程,完成排序
4、希爾排序
希爾排序也是插入排序的一種,對(duì)直接插入排序進(jìn)行了改進(jìn),它采用了一種分組的策略使用直接插入排序,讓排序的效率變得更高。分組數(shù)(也就是常說的gap,增量)
- 設(shè)為gap = n/2,向下取整,對(duì)gap個(gè)分組的每個(gè)小組的數(shù)進(jìn)行直接插入排序
- 將gap更新為gap = gap /2,向下取整,對(duì)gap個(gè)分組的每個(gè)小組的數(shù)進(jìn)行直接插入排序
- 重復(fù)這個(gè)過程直到gap為1,就是一個(gè)分組,即對(duì)整個(gè)數(shù)組進(jìn)行一次直接插入排序
比如有10個(gè)數(shù),第一次分組數(shù)就是10/2=5,這個(gè)5個(gè)分組對(duì)應(yīng)的數(shù)的序號(hào)為:
(1,6)(2,7)(3,8)(4,9)(5,10)
對(duì)5個(gè)小組的所有數(shù)都進(jìn)行一次直接插入排序
第二次分組數(shù)為5/2 = 2,這2個(gè)分組對(duì)應(yīng)的數(shù)的序號(hào)為:
(1,3,5,7,9)(2,4,6,8,10)
對(duì)2個(gè)小組的所有數(shù)都進(jìn)行一次直接插入排序
5、歸并排序
主要采用分割和合并的思路進(jìn)行排序
- 將數(shù)組按照最中間索引,分割為左右兩個(gè)數(shù)組(奇數(shù)個(gè)數(shù)的數(shù)組左右兩個(gè)數(shù)組的元素個(gè)數(shù)相差為1)
- 將左右兩個(gè)數(shù)組繼續(xù)分割為左右兩個(gè)數(shù)組,直到分割到數(shù)組只有一個(gè)元素
- 創(chuàng)建一個(gè)空的數(shù)組,依次遍歷左右數(shù)組,比較左右數(shù)組的第一個(gè)元素的大小,較小的那個(gè)元素從對(duì)應(yīng)數(shù)組中彈出
- 重復(fù)3的過程,直到兩個(gè)數(shù)組的元素都彈出,即都合并到了新數(shù)組中
- 按照1、2分割的方式,重復(fù)3、4的過程,繼續(xù)合并左右數(shù)組,直到合并至最后一個(gè)數(shù)組完成排序
因此可以看出歸并排序需要的內(nèi)存資源明顯比較大(空間復(fù)雜度較高)
6、快速排序
第一個(gè)數(shù)為記作temp,最左邊索引記為left,最右邊為right,mid=(left+right)/2
- 從nums[right]開始找比nums[left]小的數(shù),找不到right一直左移,找到將nums[right]賦給nums[left]
- 從nums[left]開始找比nums[right]大的數(shù),找不到left一直左移,找到將nums[left]賦給nums[right]
- 重復(fù)1-2的過程,使得left=right=mid,將temp賦給nums[left]
- 將原來的數(shù)組按照mid分割為兩個(gè)部分,將剩下的兩個(gè)部分重復(fù)1-3的過程
- 將剩下的數(shù)組繼續(xù)按照mid分割為兩個(gè)部分,重復(fù)1-4的過程
7、堆排序
大頂堆是一個(gè)每一個(gè)結(jié)點(diǎn)的值都大于左右子樹的結(jié)點(diǎn)的值的完全二叉樹,小頂堆是一個(gè)每一個(gè)結(jié)點(diǎn)的值都小于左右子樹的結(jié)點(diǎn)的值的完全二叉樹。在實(shí)際編程中,不需要構(gòu)造完全二叉樹這個(gè)數(shù)據(jù)結(jié)構(gòu),一個(gè)結(jié)點(diǎn)的索引為i時(shí),它的左右子樹的索引分別為(2i+1)、(2i+2),它的父節(jié)點(diǎn)的索引為ceil(i/2)-1。ceil是一個(gè)向下取整的python函數(shù)
- 構(gòu)造一個(gè)完全二叉樹,將數(shù)組的數(shù)依次放入完全二叉樹中
- 調(diào)整這個(gè)完全二叉樹為一個(gè)大頂堆
- 交換根節(jié)點(diǎn)和最后一個(gè)結(jié)點(diǎn)的值,取出最后一個(gè)結(jié)點(diǎn)的值到已排序序列中
- 刪除最后一個(gè)結(jié)點(diǎn)
- 重復(fù)2-4的過程,直到刪除整個(gè)完全二叉樹,完成排序
8、基數(shù)排序
- 首先找出最大的數(shù),將它的位數(shù)記為k
- 構(gòu)造一個(gè)桶結(jié)構(gòu),包含10個(gè)組,編號(hào)記為0-9
- 將原數(shù)組按進(jìn)行遍歷取出,將當(dāng)前遍歷的數(shù)按照個(gè)位上0-9數(shù)放入對(duì)應(yīng)0-9編號(hào)桶中
- 將桶中的數(shù)按照順序放回?cái)?shù)組中
- 將個(gè)位換成10位,重復(fù)2-4的過程,直到達(dá)到k位
因此可以知道,基數(shù)排序?qū)τ诟↑c(diǎn)數(shù)、位數(shù)大的數(shù)有更好的效率。
這就是8大排序的口述版的全部?jī)?nèi)容了,有點(diǎn)的話拜托點(diǎn)贊、收藏、關(guān)注哦。
?如果需要詳細(xì)版本,包含思路、解析、代碼、時(shí)間復(fù)雜度、空間復(fù)雜度、穩(wěn)定性分析以及排序之間的詳細(xì)比較的內(nèi)容,請(qǐng)看這篇文章:
Python實(shí)現(xiàn)八大排序:排序特點(diǎn)/原理解析/思路解析/代碼解析/考點(diǎn)解析/面試考試點(diǎn)睛(冒泡排序/選擇排序/插入排序/希爾排序/歸并排序/快速排序/堆排序/基數(shù)排序)_python排序從大到小_會(huì)害羞的楊卓越的博客-CSDN博客
我的主頁(yè)還有許多其他非常有價(jià)值的NLP內(nèi)容
Transformer提出文章論文精讀:
Transformer:《Attention is all you need》(論文精讀/原理解析/模型架構(gòu)解讀/源碼解析/相關(guān)知識(shí)點(diǎn)解析/相關(guān)資源提供)_會(huì)害羞的楊卓越的博客-CSDN博客
Transformer解讀:
Transformer算法解讀(self-Attention/位置編碼/多頭注意力/掩碼機(jī)制/QKV/Transformer堆疊/encoder/decoder)_會(huì)害羞的楊卓越的博客-CSDN博客
Hugging Face實(shí)戰(zhàn):
Hugging Face實(shí)戰(zhàn)(NLP實(shí)戰(zhàn)/Transformer實(shí)戰(zhàn)/預(yù)訓(xùn)練模型/分詞器/模型微調(diào)/模型自動(dòng)選擇/PyTorch版本/代碼逐行解析)上篇之模型調(diào)用_會(huì)害羞的楊卓越的博客-CSDN博客
bert系列算法
BERT系列算法解讀:(RoBERTa/ALBERT/DistilBERT/Transformer/Hugging Face/NLP/預(yù)訓(xùn)練模型/模型蒸餾)_會(huì)害羞的楊卓越的博客-CSDN博客
包括一些大方向的內(nèi)容:
深度學(xué)習(xí)五大基本網(wǎng)絡(luò)_常用深度學(xué)習(xí)網(wǎng)絡(luò)_會(huì)害羞的楊卓越的博客-CSDN博客
機(jī)器學(xué)習(xí)算法(全教程/全解析/源碼全解/實(shí)戰(zhàn)教程)_會(huì)害羞的楊卓越的博客-CSDN博客
人工智能的分類:機(jī)器學(xué)習(xí)/專家系統(tǒng)/推薦系統(tǒng)/知識(shí)圖譜/強(qiáng)化學(xué)習(xí)/遷移學(xué)習(xí)/特征工程/模式識(shí)別_會(huì)害羞的楊卓越的博客-CSDN博客
計(jì)算機(jī)視覺:
openCV基礎(chǔ)教程_會(huì)害羞的楊卓越的博客-CSDN博客文章來源:http://www.zghlxwxcb.cn/news/detail-641724.html
陸續(xù)更新中,有用的話拜托點(diǎn)贊收藏哦。文章來源地址http://www.zghlxwxcb.cn/news/detail-641724.html
到了這里,關(guān)于八大排序/八大排序口述版/八大排序面試版/八大排序思路(冒泡排序/選擇排序/插入排序/希爾排序/歸并排序/快速排序/堆排序/基數(shù)排序)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!