排序算法01------------------------------------冒泡排序

1.排序算法在編程中必不可少,也很常用,是必須要學的。

2.就我本人看來,最適合練習各種算法的語言非C語言不可。C語言本身語法簡單直接明瞭,沒有太多的封裝,很適合描述算法的各步驟。

一 .冒泡排序

  1)冒泡排序在排序算法中比較常見,也很簡單,適合數據量不是很大的程序,適合日常使用。

  2)冒泡排序的原理(以升序爲例):將相鄰的兩個元素進行比較,如果前面的元素比後面的元素大,則兩個元素進行交換,否則就進行下兩個相鄰元素的比較。

    這樣進行過一趟的比較,就可以把最大的元素排在最後面了。再對剩下的元素進行同樣的操作,即可排序好。這樣的排序就像冒泡一樣,符合的元素慢慢“浮”到頂端,故名冒泡排序。

  3)代碼如下,已寫好註釋。

  

 1 #include<stdio.h>
 2 //arr數組,num 元素個數 
 3 void bubbleSort(int *arr,int num)
 4 {
 5     int i,j;
 6     int temp;
 7     for(i=0;i<num-1;i++)//有num個元素,需要比較num-1次 
 8     {
 9         for(j=0;j<num-i-1;j++)//每一次的比較,需要進行num-i-1次比較, 
10         {                        //這裏的i表示已經排序好的元素個數
11                  //升序排序
12             if(arr[j]>arr[j+1])//如果前面的比後面的大,則進行交換 
13             {
14                 temp=arr[j];
15                 arr[j]=arr[j+1];
16                 arr[j+1]=temp;
17             }
18         }
19     }
20 }
21 int main()
22 {    
23     int i; 
24     int arr[10]={1,3,-9,0,10,2,8,9,19,-1};
25     bubbleSort(arr,10);//冒泡排序
26     for(i=0;i<10;i++)
27         printf("%d\n",arr[i]);
28     return 0;
29 }

 

 算法時間複雜度:O(n²)。n個元素,需要n-1次比較,每次比較需要進行n-i-1次比較。

二.拓展

曾經見過一個問題,問:有什麼方法可以提升冒泡排序的效率?

答案是:設定一個標誌flag,用這個flag表示每一次的比較是否有元素進行交換,如果沒有交換,則說明這些元素已經排好序了,那就沒必要繼續比較下去,算法到此結束。

修改後的bubbleSort如下

 1 void bubbleSort(int *arr,int num)
 2 {
 3     int i,j;
 4     int temp;
 5     int flag=0;//0表示沒有交換,1表示有交換 
 6     for(i=0;i<num-1;i++)//有num個元素,需要比較num-1次 
 7     {
 8         for(j=0;j<num-i-1;j++)//每一次的比較,需要進行num-i-1次比較, 
 9         {                        //這裏的i表示已經排序好的元素個數
10                  //升序排序
11             if(arr[j]>arr[j+1])//如果前面的比後面的大,則進行交換 
12             {
13                 temp=arr[j];
14                 arr[j]=arr[j+1];
15                 arr[j+1]=temp;
16                 flag=1; 
17             }
18         }
19         if(flag==0)//沒有交換,已排好序,直接結束循環 
20             break;
21         flag=0; 
22     }
23 }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章