一、快速排序:
快速排序和其他排序方法一樣,都是為了將數據進行簡潔又快速的排序。
其基本的實現方法其實就是經過一次排序
算法之后,先簡單地將數據分成兩部分:取一個中間數(一般為第一個元素),以這個中間數為中心,左邊的數為比這個中間數小的數,右邊的數為比這個中間數大的數。之后再進行遞歸算法,分別處理已經分好的以中間數為分界的左右兩堆數據。直到最后得到我們想要的排好序的數組。
基本步驟:
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為下標的元素,如上圖,完成一次比較。
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)
程序實現:
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 }
程序運行:
二、冒泡排序
冒泡排序原理:冒泡排序其實就是從頭開始對整個數列里面的元素進行兩兩對比,比較大的元素放到后面,接着進行對比,直到最大的一個元素被提取出來放到整個數列的最后。接着再對剩下的元素進行相同的操作,直到整個數列被排序完成。其實冒泡排序的原理很簡單,之所以被稱為金典的排序算法,其實是因為它對for循環的利用,這個我們之后可以從代碼里面看到。
簡單地用一幅圖來解釋:最大的元素就和氣泡一樣,從底往上冒出來。
同樣,我們用圖來進行說明,以下為進行比較的步驟和操作。
(1)
1和6進行比較,6大於1,不進行交換,進入到下一對比較。
(2)
6和9進行比較,9大於6,不進行交換,進入到下一對比較。
(3)
3和9進行比較,3小於9,進行交換,交換完畢進入到下一輪比較。
(4)
之后分別依次兩兩進行比較,9與2、8、4、5、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 }
程序運行:

