平時一直做專案,業務邏輯,對演算法這塊逐漸有了生疏
今天有空總結一下排序演算法
1)氣泡排序
氣泡排序的原理就是兩兩相比,從小到大的話前面比後面大就交換,從大到大的話前面比後面小就交換,比如有一組數[1,10,5,3,2]
如何對它做排序(比如從小到大)
第一步:
[1,10,5,3,2]源資料
[1,10,5,3,2]//1<10 不交換
[1,5,10,3,2]//10>5 交換
[1,5,3,10,2]//10>3 交換
[1,5,3,2,10]//10>2 交換
這樣,最高位的數10一定是最大的,所有第二步交換的時候就只對[1,5,1,2]做判斷
第二步:
[1,5,3,2]源資料
[1,5,3,2]//1<5 不交換
[1,3,5,2]//5>3 交換
[1,3,2,5]//5>2 交換
一樣,去掉最大的5
第三步:
[1,3,2]源資料
[1,3,2]//1<3 不交換
[1,2,3]//3>2 交換
一樣,去掉最大的3
第四步:
[1,2]源資料
[1,2]//1<2 不交換
到此,我們發現只剩下最後兩個數了,那麼比較也就結束了,這裡所說的比較到最後兩個數是比較的最大限度,
當然在程式裡可以控制當執行比較的時候某輪比較一次交換也沒發生,那麼,就可以提前終止比較
下面是**
integer a = new integer ;
//第一層迴圈控制比較的輪數
for (int i = 0; i < a.length-1; i++)
}if(!***)
}優點:氣泡排序實現起來比較簡單,空間複雜度低,穩定;
缺點:時間複雜度高,迴圈走的多費時間
2)選擇排序
選擇排序是分割槽排序,比如從小到大排序,開始先從陣列選出最大的數放在最高位,然後在n-1個數里再選出最大的放在次高位,以此類推,當選到只剩乙個數時停止
如[1,10,5,3,2] 源資料
選出10,放在2的位置,資料變為[1,2,5,3,10]
選出5,放在3的位置,資料變為[1,2,3,5,10]
選出3,不用移位
選出2,不用移位
**int maxindex = a.length - 1;
while (true)
}//將一輪選出的最大值跟假定的最大值作比較
if (maxnow > max)
//備選資料個數-1
maxindex--;
//最後乙個資料終止
if (maxindex == 0)
}優點:資料移動的次數已知;
缺點:不穩定
3)插入排序 插入排序跟選擇排序有點相似,都是把無序資料列中的乙個資料放到有序的資料列,區別是選擇排序你從無序資料列選出來的肯定是最大或者最小值,並且對於你這個將要插入到
有序資料列的數的位置也是固定的,是依次插入的。然而對於插入排序,你不知道無序資料列中選出來的資料會被放到有序資料列的哪個位置,只有這個數去有序資料列尋找到自己的位置時,它的位置
才會被確定。插入排序就像是打撲克牌,你手裡拿著的牌是你排好序的,當你拿起這張牌沒看它的點時這張牌的位置是不確定的,只有你看了牌的大小並且跟手牌比較之後,這張牌插的位置才會被確定。
如[1,10,5,3,2] 源資料
[1,10,5,3,2] 拿起第一張牌
[1,10,5,3,2] 拿起第二張牌
[1,5,10,3,2] 拿起第三張牌
[1,3,5,10,2] 拿起第四張牌
[1,2,3,5,10] 拿起第五張牌
//如果把無序資料比作牌堆,這層迴圈控制你拿起牌的次數
for (int i = 0; i < a.length; i++)
}優缺點:時間複雜度根據具體情況而定,空間複雜度一般,穩定性也根據實際情況,主要取決於元素的相對位置的改變,資料少速度快;
4)希爾排序(插入排序改進版)
常見的排序演算法總結
include 演算法只是比較了元素為整數的內容.大部分的排序只是做了簡單的測試.僅供參考.void swap int a int b bool less int a,int b 對內部中的元素先找到k值,然後分兩塊 int partition int r,int lo,int hi while j...
常見的排序演算法總結
氣泡排序最常見版 void bubblesort int array,size t len int main bubblesort array,6 for size t i 0 i 6 i cout endl void bubblesort int array,size t len int main...
常見的排序演算法總結
1.氣泡排序 就像冒泡一樣,從頭對比相鄰的兩個,大的 或者小的 就交換到後面,一直到序列有序。時間複雜度最壞,平均o n 2 最好的時候是初始序列有序,第一趟後就不在發生交換,停止排序時間複雜度o n 空間複雜度為o 1 a 11 2,41 7,22 80,67 1,0.1,88 def bubbl...