1. 程式人生 > 資訊 >理想 L9 汽車詳情公佈:45~50 萬元,標配兩顆高通驍龍晶片、車載 3K 屏

理想 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) ,時間複雜度和資料狀況無關。