題目要求
算法
冒泡排序,用一句話來總結:
一組數中,相鄰的兩個數進行比較、交換,將最大(小)數交換至尾(首)部,即完成了一次冒泡排序
要想對N個數字進行排序,循環N次即可.
如果真的不理解冒泡排序算法,請點擊:冒泡排序_360百科
核心代碼
//方式一:從頭向尾遍歷,將最大數(相對)沉入尾部(相對) void BubbleSort1(int *arr,int sz){ int i = 0; int j = 0; assert(arr); for(i=0;i<sz-1;i++){ for(j=0;j<sz-i-1;j++){ if(arr[j]>arr[j+1]){ int tmp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = tmp; } } } } //方式二:從尾向頭遍歷,將最大數(相對)冒泡到頭部(相對) void BubbleSort2(int *arr,int sz){ int i = 0; int j = 0; assert(arr); for(i=0;i<sz-1;i++){ for(j=sz;j>i;j--){ if(arr[j]>arr[j-1]){ int tmp = arr[j]; arr[j] = arr[j-1]; arr[j-1] = tmp; } } } }
完整代碼
/* *本代碼版權歸高小調博客所有 *作者:高小調 *日期:2016-9-9 *代碼功能:通過C語言實現冒泡排序算法 *集成開發環境:Microsoft Visual Studio 2010 */ #include<stdio.h> #include<assert.h> #include<stdlib.h.h> //從頭向尾遍歷 //相鄰兩數進行比較 //將最大數(相對)沉入尾部(相對) void BubbleSort1(int *arr,int sz){ int i = 0; int j = 0; assert(arr); for(i=0;i<sz-1;i++){ for(j=0;j<sz-i-1;j++){ if(arr[j]>arr[j+1]){ int tmp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = tmp; } } } } //從尾向頭遍歷 //相鄰兩數進行比較 //將最小數(相對)冒泡到頭部(相對) void BubbleSort2(int *arr,int sz){ int i = 0; int j = 0; assert(arr); for(i=0;i<sz-1;i++){ for(j=sz;j>i;j--){ if(arr[j]>arr[j-1]){ int tmp = arr[j]; arr[j] = arr[j-1]; arr[j-1] = tmp; } } } } //測試函數 //為了方便起見,將參數設定為一個函數指針 void TestBubbleSort(void (*BubbleSort)(int *arr,int sz)){ int arr[]={1,3,5,7,9,2,4,6,8,0}; int i = 0; int sz = sizeof(arr)/sizeof(arr[0]); BubbleSort(arr,sz); for(i=0; i<sz; i++){ printf("%d ",arr[i]); } printf("\n"); } int main(){ TestBubbleSort(BubbleSort1); TestBubbleSort(BubbleSort2); system("pause"); return 0; }
輸出結果
以上只是冒泡排序算法的基本實現,還有很大的優化空間.至於優化的具體細節,詳見下文.
(本文來源於互聯網,若有侵權,請聯系博主)