理想 L9 汽車詳情公佈:45~50 萬元,標配兩顆高通驍龍晶片、車載 3K 屏
一、基本思想
氣泡排序是一種簡單的排序演算法,它也是一種穩定排序演算法。其實現原理是重複掃描待排序序列,並比較每一對相鄰的元素,當該對元素順序不正確時進行交換。一直重複這個過程,直到沒有任何兩個相鄰元素可以交換,就表明完成了排序。
二、用例
假設待排序序列為 (5,8,6,2,9,3),如果採用氣泡排序對其進行升序(由小到大)排序,則整個排序過程如下所示:
1) 第一輪排序,此時整個序列中的元素都位於待排序序列,依次掃描每對相鄰的元素,並對順序不正確的元素對交換位置,整個過程如圖所示。
2) 第二輪排序,繼續依次掃描每對相鄰元素,對順序不正確的元素對交換位置,整個過程如圖所示。
3) 第三輪排序,此時待排序序列包含前 3 個元素,依次掃描每對相鄰元素,對順序不正確的元素對交換位置,整個過程如圖所示。
4) 第四輪排序,此時待排序序列包含前 2 個元素,對其進行氣泡排序的整個過程如圖所示。
5) 第五輪氣泡排序時,待排序序列中僅剩 1 個元素,無論再進行相鄰元素的比較,因此直接將其併入已排序序列中,此時的序列就認定為已排序好的序列(如圖所示)。
三、實現程式碼
c語言程式碼
1 #include<stdio.h>
2 #define N 5
3 int list[N]={5,8,6,2,9};
4 //交換位置函式
5 void swap(int *a,int *b);
6 //實現氣泡排序輸出函式,輸出實現的具體步驟
7 void MpSort_test();
8 //主函式
9 int main(){
10 MpSort_test();
11 return 0;
12 }
13 void swap(int *a,int *b){
14 int temp = *a;
15 *a = *b;
16 *b = temp;
17 }
18 void MpSort_test(){
19 for (int i = 0; i < N; ++i) {
20 for (int j = 0; j + 1 < N - 1; ++j) {
21 //比較相鄰的元素,當順序有錯時進行交換
22 if(list[j] > list[j+1]){
23 swap(&list[j],&list[j+1]);
24 }
25 }
26 //輸出本輪排序後的結果
27 printf("第%d輪氣泡排序:",i+1);
28 for (int j = 0; j < N; ++j) {
29 printf("%d",list[j]);
30 }
31 printf("\n");
32 }
33 }
java程式碼
1 public class MpSort {
2 public static void main(String[] args) {
3 int[] arr={5,8,6,2,9,3};
4 for (int i =1; i < arr.length;i++){
5 for (int j = 0; j < arr.length-i;j++){
6 if (arr[j]>arr[j+1]){
7 int temp = arr[j];
8 arr[j] = arr[j+1];
9 arr[j+1] = temp;
10 }
11 }
12
13 System.out.print("第"+i+"次排序:");
14 for(int num:arr){
15 System.out.print(num+" ");
16 }
17 System.out.println(" ");
18 }
19 }
20 }
四、演算法分析
(1)由此可見:N個數字要排序完成,總共進行N-1趟排序,每i趟的排序次數為(N-i)次,所以可以用雙重迴圈語句,外層控制迴圈多少趟,內層控制每一趟的迴圈次數
(2)氣泡排序的優點:每進行一趟排序,就會少比較一次,因為每進行一趟排序都會找出一個較大值。如上例:第一趟比較之後,排在最後的一個數一定是最大的一個數,第二趟排序的時候,只需要比較除了最後一個數以外的其他的數,同樣也能找出一個最大的數排在參與第二趟比較的數後面,第三趟比較的時候,只需要比較除了最後兩個數以外的其他的數,以此類推……也就是說,沒進行一趟比較,每一趟少比較一次,一定程度上減少了演算法的量。
(3)時間複雜度
1.如果我們的資料正序,只需要走一趟即可完成排序。所需的比較次數C和記錄移動次數M均達到最小值,即:Cmin=n-1;Mmin=0;所以,氣泡排序最好的時間複雜度為O(n)。
2.如果很不幸我們的資料是反序的,則需要進行n-1趟排序。每趟排序要進行n-i次比較(1≤i≤n-1),且每次比較都必須移動記錄三次來達到交換記錄位置。在這種情況下,比較和移動次數均達到最大值:
綜上所述:氣泡排序總的平均時間複雜度為:O(n2) ,時間複雜度和資料狀況無關。