冒泡排序 小白学demo_day2
冒泡排序的過(guò)程:
重復(fù)地走訪要排序的元素,依次比計(jì)較兩個(gè)相鄰的元素,如果他們的順序錯(cuò)誤就把他們交換過(guò)來(lái)。走訪元素的工作室重復(fù)地進(jìn)行直到?jīng)]有相鄰元素需要交換,也就是說(shuō)該元素列已經(jīng)排序完成。
簡(jiǎn)單說(shuō),就是比較相鄰的兩個(gè)元素,將值大的元素交換到右邊
是否穩(wěn)定
如果遇到相等的值不進(jìn)行交換,那這種排序方式是穩(wěn)定的排序方式,因此,冒泡排序是一種穩(wěn)定排序算法
算法
N個(gè)數(shù)字要排序完成,總共進(jìn)行N-1趟排序,每i趟的排序次數(shù)為(N-i)次,所以可以用雙重循環(huán)語(yǔ)句,外層控制循環(huán)多少趟,內(nèi)層控制每一趟的循環(huán)次數(shù)
時(shí)間復(fù)雜度
1,如果我們的數(shù)據(jù)正序,只需要走一趟即可完成排序,所需的比較次數(shù)C和記錄移動(dòng)次數(shù)M均達(dá)到最小值,即:C min=n-1; M min = 0;所以,最好的時(shí)間復(fù)雜度為O(n)
2,如果很不幸,我們的數(shù)據(jù)是反序的,則需要進(jìn)行n-1趟排序,每趟排序要進(jìn)行n-i次比較(1<=i<=n-1),且每次比較都必須移動(dòng)記錄三次來(lái)達(dá)到交換記錄位置。在這種情況下,比較和移動(dòng)次數(shù)均達(dá)到最大值:
所以,最終的時(shí)間復(fù)雜度為:O(n^2)
冒泡排序的示例
[2 4 3 1 6 5] 初始狀態(tài)序列 [2 3 1 4 5][6] 第一次冒泡結(jié)束 [2 1 3 4][5 6] 第二次冒泡結(jié)束 [1 2 3][4 5 6] 第三次冒泡結(jié)束 [1 2][3 4 5 6] 第四次冒泡結(jié)束 [1 2 3 4 5 6] 第五次冒泡結(jié)束冒泡排序常規(guī)代碼
void bubble_sort(int[] arr,int len) {//一定要記住判斷邊界條件if(arr == null || len < 2) {return;}for(int i = 0;i < len-1; i++) {//第i趟比較for(int j = 0; j < len -1 -i; i++){//開(kāi)始進(jìn)行比較,如果前面值比后面值大,那就交換位置if (arr[j] > arr[j+1]) {int t = arr[j];arr[j] = arr[j+1];arr[j+1] = t;}}}System.out.println("最終得到的數(shù)組是:")for (int k = 0; k< arr.length;k++) {System.out.println(arr[k]+"");} }如果,設(shè)置一個(gè)標(biāo)志位,不再進(jìn)行數(shù)據(jù)交換,說(shuō)明已經(jīng)排序完成,則無(wú)需再進(jìn)行交換
冒泡排序的簡(jiǎn)單優(yōu)化代碼:
void bubble_sort(int[] arr) {if(arr == null || arr.length < 2) {return;}int flag = 0;for(int i = 0; i < arr.length; i++) {for( int j = 0; j < arr.length -1 -i; j++) {if(arr[j] > arr[j+1]) {int t = arr[j];arr[j] = arr[j+1];arr[j+1] = t;flag = 0; //發(fā)生交換,標(biāo)志位置為0}}}System.out.println("第%d遍最終結(jié)果:",i+1);for(int count : list) {System.out.println(count);}System.out.println("");if (flag == 1) {return;} }總結(jié)
以上是生活随笔為你收集整理的冒泡排序 小白学demo_day2的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 查找数组B中不在数组A中的元素
- 下一篇: 选择排序之小白学算法