快速排序及冒泡排序詳解

1、快速排序:算法

        快速排序和其餘排序方法同樣,都是爲了將數據進行簡潔又快速的排序。
其基本的實現方法其實就是通過一次排序 算法以後,先簡單地將數據分紅兩部分:取一箇中間數(通常爲第一個元素),以這個中間數爲中心,左邊的數爲比這個中間數小的數,右邊的數爲比這個中間數大的數。以後再進行遞歸算法,分別處理已經分好的以中間數爲分界的左右兩堆數據。直到最後獲得咱們想要的排好序的數組。

基本步驟:數組

1.先肯定一個對比數(中間數),通常爲第一個元素。
2.取兩個變量i、j,i爲下標的數字爲這個數組的第一個元素,j爲下標的數字爲這個數組的最後一個元素。
3.首先從後向前開始進行比較,即最後一個元素與中間數比較,若是最後一個元素的值大於第一個元素,j--,繼續進行比較,若是j爲下標的元素的值小於第一個元素,將j爲下標的元素的值賦給i爲下標的元素。結束這一次比較。
4.開始從前日後進行比較,若是第一個數的值小於中間數,i++,接着進行比較,若是i爲下標的元素的值大於中間數,將這個數字的值賦給j爲下標的元素。結束這一次比較。
5.重複3和4步驟,直至i>=j。
 
  文字的表述可能不是很形象,不少人仍是不能理解,咱們用圖來進行說明。
(1)

  這是給定的最初始的數組,咱們先肯定一箇中間數,把第一個元素設成中間數,I標識數組的第一個元素的下標,J標識數組最後一個元素的下標。
(2)

  I<J,從J爲下標的數字開始比較,8比中間數大,J--,2比中間數小,將J爲下標的元素的值賦給I爲下標的元素,如圖,此時完成一次比較。
(3)

  I<J, 完成一次J開始的比較以後,從I爲下標的元素進行比較,2小於中間數,I++,6大於中間數,將I爲下標的元素的值賦給J爲下標的元素,如上圖,完成一次比較。
(4)

  I<J, 繼續從J開始進行比較,3比中間數小,賦值給I爲下標的元素,結束一次比較。
(5)

  I<J, 繼續從I開始比較,7比中間數大,賦值給J爲下標的元素,結束一次比較。
(6)

   I<J,繼續從J開始比較,4比中間數小,賦值給I爲下標的元素,結束一次比較。
(7)

  再次從I開始進行比較,當I=J的時候,中止比較。
  將中間數賦值給I爲下標的元素,結束一輪的比較。
  從上圖能夠看到:當完成一次快速排序以後,在中間數左邊的數都比中間數小,而在中間數右邊的數都比中間數大。以後依次對左邊和右邊的數據進行快速排序,遞歸運算,最後獲得咱們所要的結果。

程序實現:
 1 #include <stdio.h>
 2  void QuickSort(int arr[], int left, int right)
 3  {
 4         int i = left;
 5         int j = right;
 6         int tmp = arr[i];//設定中間數
 7         if(i < j)//判斷是否進入遞歸
 8         {
 9                 while(i < j)//判斷是否完成一次快速排序
10                 {
11                         while((arr[j] > tmp)&&(i < j))
12                         {
13                                 j--;
14                         }
15                         arr[i] = arr[j];
16                         while((arr[i] < tmp)&&(i < j))
17                         {
18                                 i++;
19                         }
20                         arr[j] = arr[i];
21                 }
22                 arr[i] = tmp;//賦值中間數
23                 QuickSort(arr, left, i-1);//遞歸中間數左邊的元素
24                 QuickSort(arr, j+1, right);//遞歸中間數右邊的元素
25         }
26         else
27         {
28                 return;
29         }
30  }
31 int main()
32 {
33         int i = 0;
34         int arr[9] = {5,6,7,1,4,9,3,2,8};
35         printf("未排序前:");
36         for(i = 0; i<9; i++)
37         {
38                 printf("%d ",arr[i]);
39         }
40         printf("\n");
41         printf("\n");
42         QuickSort(arr, 0, 8);//傳入要排序數組,i的值和j的值。
43         printf("實現排序以後:");
44         for(i = 0; i<9; i++)
45         {
46                 printf("%d ",arr[i]);
47         }

48         printf("\n");
49         return 0;
50 }

程序運行:
數據結構

 

 

2、冒泡排序ui

 
  冒泡排序原理:冒泡排序其實就是從頭開始對整個數列裏面的元素進行兩兩對比,比較大的元素放到後面,接着進行對比,直到最大的一個元素被提取出來放到整個數列的最後。接着再對剩下的元素進行相同的操做,直到整個數列被排序完成。其實冒泡排序的原理很簡單,之因此被稱爲金典的排序算法,實際上是由於它對for循環的利用,這個咱們以後能夠從代碼裏面看到。
  簡單地用一幅圖來解釋:最大的元素就和睦泡同樣,從底往上冒出來。


  一樣,咱們用圖來進行說明,如下爲進行比較的步驟和操做。
(1)

  1和6進行比較,6大於1,不進行交換,進入到下一對比較。
(2)

   6和9進行比較,9大於6,不進行交換,進入到下一對比較。
(3)

  3和9進行比較,3小於9,進行交換,交換完畢進入到下一輪比較。
(4)

  以後分別依次兩兩進行比較,9與二、八、四、五、7比較後來到最後的位置,這時候9就是最大的一個元素。到此,完成一次冒泡,以後再一一進行冒泡,直到整個數列排序完成。

程序實現:
 1 #include <stdio.h>
 2 void Sort(int arr[], int sz)
 3 {
 4         int i = 0;
 5         int j = 0;
 6         for(i=0; i<sz; i++)//判斷進行多少次比較
 7         {
 8                 for(j=0; j<sz-i-1;j++)//判斷進行多少對比較
 9                 {
10                         if(arr[j]>arr[j+1])//判斷大小進行交換
11                         {
12                                 int tmp = arr[j];
13                                 arr[j] = arr[j+1];
14                                 arr[j+1] = tmp;
15                         }
16                 }
17         }
18 }
19 int main()
20 {
21         int i = 0;
22         int sz = 0;
23         int arr[9] = {1,6,9,3,2,8,4,5,7};
24         sz = sizeof(arr)/sizeof(arr[1]);
25         printf("未進行排序以前:");
26         for(i=0; i<9; i++)
27         {
28                 printf("%d  ",arr[i]);
29         }
30         printf("\n");
31         Sort(arr, sz);
32         printf("進行排序以後:");
33         for(i=0; i<9; i++)
34         {
35                 printf("%d  ",arr[i]);
36         }
37         printf("\n");
38         return 0;
39 }

程序運行:spa

相關文章
相關標籤/搜索