排序算法一:冒泡排序,插入排序以及选择排序原理与MATLAB实现
最近在學(xué)習(xí)排序算法的一些知識。還是比較有趣的。所以好好研究了一下各個算法。并且使用matlab進(jìn)行了個基本的實(shí)現(xiàn),目前僅僅是實(shí)現(xiàn)吧,優(yōu)化什么的可能目前的水平達(dá)不到吧,畢竟是用matlab實(shí)現(xiàn),還是比較簡單。以后還是希望使用C/C++,或者python來實(shí)現(xiàn)一下。先本著學(xué)習(xí)算法思想的原則,用matlab搞一搞吧。
冒泡排序
冒泡排序 思想
這個方法就是在每一趟的循環(huán)中依次比較前后兩個元素之間的大小,然后進(jìn)行一個交換。這樣在多趟循環(huán)中實(shí)現(xiàn)無序數(shù)列的有序排列。下面是使用matlab實(shí)現(xiàn)的
算法時(shí)間復(fù)雜度分析
從上面的代碼可以看出來,外層循環(huán)也就是趟數(shù)最多為N?1次,而內(nèi)層循環(huán)比較次數(shù)最多為N次,最少為1次,所以平均
次數(shù)為N+12次,所以總的次數(shù)為T(n)=(N?1)×N+12=N2?12次,所以其算法時(shí)間復(fù)雜 度為O(n2).
冒泡改進(jìn)
有時(shí)候碰到的序列里面有大部分是有序,只有少數(shù)的無序的,那么有可能就不需要比較那么多趟去實(shí)現(xiàn)這個冒泡,因此,可以設(shè)置一個旗幟變量exchangeFlag,發(fā)生元素交換了,則exchangeFlag=1,否則為0.
那么改進(jìn)之后的代碼為:
這里就有一個旗幟變量,進(jìn)行一個統(tǒng)計(jì)是否發(fā)生了元素交換。這樣的當(dāng)一個序列里面大部分有序,只有少數(shù)無序的時(shí)候就比較使用,不要去試行N?1趟的比較了。
- Python 實(shí)現(xiàn)
插入排序
插入排序的思想
插入排序是在一個已經(jīng)有序的小序列的基礎(chǔ)上,一次插入一個元素。當(dāng)然,剛開始這個有序的小序列只有1個元素,就是第一個元素。比較是從有序序列的末尾開始,也就是想要插入的元素和已經(jīng)有序的最大者開始比起,如果比它大則直接插入在其后面,否則一直往前找直到找到它該插入的位置。如果碰見一個和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后順序沒有改變,從原無序序列出去的順序就是排好序后的順序,所以插入排序是穩(wěn)定的。
matlab代碼
測試輸出結(jié)果為:
-1 1 2 3 4 5 6 7 8算法時(shí)間復(fù)雜度分析
對于第i個元素來說,其需要比較的次數(shù)為 i?1 次,那么對于有N個元素的序列來說,最壞的情況下,其需要的次數(shù)為
T(n)=1+2+3+?+(n?1)=n(n?1)2,也就是說其算法時(shí)間復(fù)雜度為 O(n2) 。
python實(shí)現(xiàn)
簡單選擇排序
簡單選擇排序思想
在要排序的一組數(shù)中,選出最小(或者最大)的一個數(shù)與第1個位置的數(shù)交換;然后在剩下的數(shù)當(dāng)中再找最小(或者最大)的與第2個位置的數(shù)交換,依次類推,直到第n-1個元素(倒數(shù)第二個數(shù))和第n個元素(最后一個數(shù))比較為止。
matlab代碼實(shí)現(xiàn)
算法時(shí)間復(fù)雜度分析
第一趟,需要比較 N?1 次,第二趟需要比較 N?2 次,?,第 N?1 次需要比較1次就可以了。因此總的比較次數(shù)
為:T(n)=1+2+3+?+(n?1)=n(n?1)2,也就是說其算法時(shí)間復(fù)雜度為 O(n2) 。
今天就先學(xué)些到這,后續(xù)繼續(xù)學(xué)習(xí)補(bǔ)充,希望大神路過指點(diǎn)。
總結(jié)
以上是生活随笔為你收集整理的排序算法一:冒泡排序,插入排序以及选择排序原理与MATLAB实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 备案种类怎么填写(备案种类)
- 下一篇: FPGA硬件学习基础知识点总结(1)