1.核心思想:
根據要求,對陣列進行相鄰的兩兩元素之間的比較,如果反序就進行交換,直到陣列沒有反序的相鄰的元素為止。
2.實現:
①非標準氣泡排序:
讓每乙個關鍵字arr[i],都和它後面的每乙個關鍵字做比較(即從arr[i+1]開始比較,依次向後),如果大則交換,這樣第一位置的關鍵字在一次迴圈之後一定會變成這個陣列中的最小值。
但是,這種排序方法不算是標準的氣泡排序,因為它不符合兩兩比較相鄰記錄。當然這種排序方法也是有缺陷的,那就是在排序好了前面的部分位置後,對其餘關鍵字的排序是沒有幫助的,如:反而有可能把相對比較小的記錄交換到了比較靠後的位置。也就是說,這種實現方法的效率非常低。
②正宗冒泡演算法:
如當i=0時,變數j從倒數第二個即arr[len-2]反向迴圈到i,逐個比較,將最小值交換到前面,知道最後找到最小值放置在下標為0的位置。
這種演算法在不斷迴圈的過程中,除了把關鍵字最小的放到第一的位置,還讓較小的數距離目標地點更近了一些,顯然這是比第一種演算法有進步的,在上十萬條資料的排序過程中,這種差距就會體現出來。
1inti,j;
2for(i=0;i)312
}13 }
③氣泡排序的優化:針對陣列部分有序:
可以在進入迴圈之前定義乙個bool型別的flag變數並且初始化為true,進入第一層迴圈將這個flag置為false,如果在進入第二層迴圈之後,進行了交換就將這個變數置為true,當再次進行外層迴圈的時候,通過flag來判斷上次兩兩比較有沒有發生交換,如果沒有,則flag值為false,不能再繼續進行迴圈,排序結束。通過這樣使冒泡演算法在效能上得到了提公升,避免了有序情況下無意義的迴圈判斷,減少了迴圈和交換的次數。
**實現:
1 #include2using
namespace
std;34
void bubblesort(int arr,int
len)522
}23}24
25return;26
}2728void printarr(int arr,int
len)
2936
37int
main()38;
40int arr[10] = ;
41 bubblesort(arr,sizeof(arr)/sizeof(arr[0
]));
42 printarr(arr,sizeof(arr)/sizeof(arr[0
]));
4344 system("
pause");
45return0;
46 }
3.時間複雜度:
最好情況:排序本身就有序,比較次數n-1,沒有資料交換,時間複雜度o(n);
最壞情況:即使是逆序,比較次數(n*(n-1))/2,時間複雜度o(n2);
因此,總的時間複雜度為o(n2)。
排序演算法 氣泡排序
一.氣泡排序的過程 公升值排序 1.將第乙個記錄的關鍵字與第二個記錄的關鍵字進行比較,若key 1 key 2 則交換。然後比較第二個與第三個,依此類推,直到第n 1個與第n個比較為止,第一趟排序完後,記錄最大的關鍵字會被排在最後面。2.將記錄的前n 1個關鍵字進行第二趟比較交換,直到前n 1個中最...
排序演算法 氣泡排序
從基礎重新抓起。氣泡排序 每次從陣列頭到尾選出最大或者最小的,排到尾部或者頭部。以排序結果從小到大為例 每次從陣列中把最大的調換到末尾。eg.元素個數 count,需要找count 1次 外迴圈,最後一次不用再做比較了 每次從頭到末尾沒有確定的資料中找最大的 內迴圈 做法就是比較相鄰兩個元素的大小,...
排序演算法 氣泡排序
排序演算法是處理資料最基礎的演算法,掌握各種排序演算法有利以後遇到資料時的處理。首次學習,先學習氣泡排序。氣泡排序原理 對一組待排序資料x1,x2,x3,x4,x5,x6,x7.xn,氣泡排序演算法指標 這裡的指標並不是實際的指標,只是為方便而假象的乙個類似指標的東西 從第乙個資料開始,與其後面的乙...