四种排序:选择,插入,冒泡,快速排序原理及其对应的时间、空间复杂度解析
四種排序:選擇,插入,冒泡,快速排序原理及其對應的時間空間復雜度
首先,在了解四種排序之前,讓我們來了解一下什么是時間復雜度和空間復雜度。
時間復雜度:算法的時間復雜度是一個函數,它定性描述該算法的運行時間。記做T(n)。直白的來說,就是指運行一段代碼所需要的時間。
空間復雜度:空間復雜度是對一個算法在運行過程中臨時占用存儲空間大小的量度。記做S(n)。同樣的,它是指運行一段代碼所需要占用的內存大小。
四種排序:
一.冒泡排序:
你見過魚兒吐泡泡嗎?每次吐一串泡泡,最大的泡泡都會冒到水上,然后是下一個,當最后一個泡泡也冒到水面上時,那么一串泡泡也吐完了。
冒泡排序,顧名思義,和吐泡泡是一個原理。
當有一串無需數列待排序時,那么冒泡排序就會每次挑選出最大的數,置于這串數的末尾,然后從剩下的數中再挑選出最大的放置在末尾(這里的末尾應當指當前剩余未排列數組的末尾,即上次排好的數之前)。重復,直到最后一個數被排完。
例: 1 3 5 4 2
要求將這段數升序排列
值得注意的是,如果剩余幾個數未進行比較,但是所有的數都已序,那么剩余的數依舊要比較,直到所有的數都比較完。
附上代碼:
那么,冒泡排序的時間復雜度和空間復雜度各是多少呢?
時間復雜度:
現在我們假設每運行一行代碼的時間為t,那么外層循環運行了n-1次,時間為(n-1)t,內層循環運行了n次,時間為nt。
這里,要考慮內層循環的條件判斷內容是否執行。
若不出現要交換的次數時
時間最短就為(n-1)+1,時間復雜度為O(n*t),即O(n)。
若每次都需要交換
時間最長就為(n-1)3nt,時間復雜度為O((3n2-3n)*t),即O(n2)。
考慮到平均性,我們將以上時間都除以2,那么得到的,就分別是他們的平均時間復雜度。
但是通常情況下,我們認為冒泡排序的時間復雜度為O(n2)。
空間復雜度:
計算空間復雜度時,我們也要分情況考慮。
最優情況為不需要交換,即沒有任何臨時變量占用空間。
所以空間復雜度為:0;
最壞的情況是全為逆序數,則內層循環每次都要開辟一個temp臨時變量的內存,內層循環共n次,即空間復雜度為:O(n)。
平均空間復雜度:O(1)
二.選擇排序
選擇排序:即在一組無序數列中,每次選出最大或最小的數,放置在數列的開頭,然后繼續選出剩下數中最大或最小的數放在已選擇數的后面,重復直到最后一個數被選完。
例:1 3 5 2 4
要求將這組數升序排列
那么第一次使用選擇排序的結果:
(1 3 )(1 5) (1 2) (1 4)
1 3 5 2 4
第二次:
1 2 3 5 4
第三次:
1 2 3 5 4
第四次:
1 2 3 4 5
同樣的,如果某些數段出現了已序現象,那么依舊要繼續遍歷完直到最后一個數被選完。
附上代碼:
下面我們來計算選擇排序的時間復雜度和空間復雜度。
依舊設每個代碼執行的時間為t,下同
時間復雜度:
最優情況:當前數列全部已序
那么交換的次數為0次
則時間為(n-1)*t,即最優時間復雜度為O(n)。
最差情況:當前數列全為逆序
那么交換的次數為n-1次
則時間為n*(n-1)*t,即O(n2)。
取平均時間復雜度,則選擇排序時間復雜度為O(n2)。
空間復雜度:
最好的情況:不需要交換,
那么空間復雜度為0
最壞的情況:全為逆序數
那么整個過程就需要temp,i,j,k臨時變量,即為4
取平均值可以得到選擇排序的空間復雜度為O(1)。
三.插入排序
插入排序:插入排序是一種最簡單的排序,即在一組無序數列中,將數列分成有序和無序兩部分,一般默認第一個數為已序,將第二個數按照排序準則插入已序數列,再將第三個數插入前兩個數組成的已序數列,重復。直到最后一個數被插入。
例:1 3 5 2 4
要求將這組數升序排列
那么第一次使用插入排序的結果:
1 3 5 2 4
1 3 5 2 4
第二次:
1 3 5 2 4
1 3 5 2 4
第三次:
1 3 5 2 4
1 2 3 5 4
第四次:
1 2 3 5 4
1 2 3 4 5
依然要注意的是在中途出現已序數段要參與比較。
附上代碼:
插入排序的時間復雜度和空間復雜度:
時間復雜度:
最優情況:全為已序數
那么只要比較n-1次,時間為(n-1)*t,
時間復雜度為O(n);
最壞情況:全為逆序數
那么最多要比較(n-1)*(n-1)/2次
時間復雜度為O(n2)。
平均時間復雜度為O(n2)。
空間復雜度:
最好的情況:全為已序數
無需交換兩個數
空間復雜度為0
最壞的情況:全為逆序數
全程需要用到臨時變量i j k
所以空間復雜度為O(1);
插入排序的平均空間復雜度為:O(1)。
四.快速排序
快速排序:快速排序是通過一次分割將一個數列分割成以某個數為界限的左右兩部分,一邊數小于這個分界值,另一邊大于這個分界值。分別再將兩遍的數,按照同樣的方法各選取一個分界值,分成大于和小于分界值的兩部分,依次類推,直到分界值左右部分的數不可再分為止。
例:25 20 30 40 35 50 45
要求將這組數升序排列
任意設定一個分界值:30(但是一般以第一個數為分界值)
那么第一次使用快速排序的結果:
{25 20} 30 {40 35 50 45}
第二次:
再給兩邊選擇分界值
20 {25} 30 {35} 40 {50 45}
此時第一次分界值30左邊的部分全部已序,那么下面只要排列右邊即可
第三次:
20 {25} 30 {35} 40 {45} 50
到此為止,所有數列全部已序。
要注意的是,當一部分數列已序時,只需要考慮剩余部分即可。
該排序屬于一種遞歸算法。
附上代碼:
快速排序的時間復雜度和空間復雜度:
時間復雜度:
最好的情況:
每次劃分都將數組平均分:
那么數的個數為(log以2為底2n+1)
第一次要全部遍歷,時間為nt
第二次為nt/2
第三次nt/4
……
第n次nt/2的(n減一次方)
則總的T(n)=nT(1)+(log以2為底n)*n
時間復雜度為O(nlog2(n))
即時間復雜度為O(nlogn)。
最壞的情況:
每次選擇的分界值只能分出一個子序列,另一個為空。
那么此時需要n-1次遞歸調用
時間復雜度為O(n2)。
空間復雜度:
最好的情況:每次分割都平均分
所以分割次數為log2(n)
空間復雜度就為O(logn)
最壞的情況:
依舊是每次分割都分割一個子序列和一個空序列。
那么此時需要遞歸n-1次調用
則空間復雜度為O(n)
快速排序的平均空間復雜度則為O(logn)。
總結
以上是生活随笔為你收集整理的四种排序:选择,插入,冒泡,快速排序原理及其对应的时间、空间复杂度解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STC51单片机26——串口发送DS18
- 下一篇: jsDelivr的正确打开方式