排序 时间倒序_经典排序算法之冒泡排序(Bubble Sort)
冒泡排序 (?Bubble Sort?)
冒泡排序,正如它的名字一樣,未排序數組中的最大(小)值會依次往上浮。冒泡排序主要有兩個基本步驟:相鄰元素之間的比較 和 交換位置。
步驟分析:
令待排序序列為 data,規模為 n ,按照升序進行排序,則冒泡排序的步驟可以總結為:
從第一個元素開始,在兩相鄰元素之間進行比較,如果前一個元素 大于 后一個元素,則交換位置,否則 沒有操作。
然后比較第二個元素 和 第三個元素。如果第二個元素 大于 第三個元素,則交換位置,否則 沒有操作。
一直比較到第 n-1 和第 n 個元素( n為待找出最大數字的序列的規模 ),找出這 data[0] 到 data[n-1] 這 n 個數據中最大的數字。此時,最大的數字會被放在 data[n-1] 的位置,即最后面。
重復步驟 1 到 步驟 3 ,一直比較到待找出最大數字的序列的規模為 1 ,因為只剩一個元素,所以就不用比較了。
如下圖,該數據序列 data 一共有5個元素,他們為 [ 5, 3, 4, 1, 2 ] ,下圖給出了找出 data 序列中最大數字 5 的冒泡過程。
代碼( C++ ):
class Solution {public: vector sortArray(vector& nums) { int size = nums.size(); if(size<=1)return nums; // 外層循環可以看做 1. 冒泡排序的趟數(一共比較 size-1 趟) 2. 浮起的第 i 個最大的數字 for(int i=1; i bool flg = true; // 記錄待排序數組是否有序,有序為 true, // 每次都從第一個元素開始,比較相鄰的兩個元素,找出未排序數組中的最大值,一直到 for(int j=0; j if(nums[j]>nums[j+1]){ // 觸發交換的條件 int tmp = nums[j+1]; nums[j+1] = nums[j]; nums[j] = tmp; flg = false; // 如果待排序數組發生交換,則說明是無序的 } } if(flg) break; } return nums; }};本段代碼多了一個標志變量 flg,flg 是用來標記剩下的序列中有沒有發生交換的,如果沒有發生交換,說明剩下的序列是有序的,就不需要再傻傻地都比較一遍了,可以提前結束排序。
分析:
從時間復雜度、空間復雜度、穩定性三個方面對冒泡排序進行分析。
時間復雜度
最好時間復雜度:當待排序列已經是有序的,我們只需要一次冒泡操作就可以退出排序流程,因此最好時間復雜度為 O(n)。
最壞時間復雜度:當待排序列是倒序時,需要進行 n-1 次冒泡排序,因此最壞時間復雜度為 O(n2)。
空間復雜度
冒泡排序只有在交換的時候會申請內存輔助交換操作,所申請的內存空間大小是常量級的,與數據規模 n 無關,因此空間復雜度為 O(1)。冒泡排序算法為就地排序。
穩定性
當兩相鄰元素大小相等時,不會觸發交換操作,他們的相對位置也不會發生變化。因此,冒泡排序算法是穩定的。
總結
以上是生活随笔為你收集整理的排序 时间倒序_经典排序算法之冒泡排序(Bubble Sort)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 谁能帮我过圣麟
- 下一篇: 安装esp8266库_基于ESP8266