冒泡排序(BubbleSort)
冒泡排序的基本概念:
依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟:首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。至此第一趟結束,將最大的數放到了最後。在第二趟:仍從第一對數開始比較(因爲可能由於第2個數和第3個數的交換,使得第1個數不再小於第2個數),將小數放前,大數放後,一直比較到倒數第二個數(倒數第一的位置上已經是最大的),第二趟結束,在倒數第二的位置上得到一個新的最大數(其實在整個數列中是第二大的數)。如此下去,重複以上過程,直至最終完成排序。由於在排序過程中總是小數往前放,大數往後放,相當於氣泡往上升,所以稱作冒泡排序。
實現:
外循環變量設爲i,內循環變量設爲j。假如有10個數需要進行排序,則外循環重複9次,內循環依次重複9,8,...,1次。每次進行比較的兩個元素都是與內循環j有關的,它們可以分別用a[j]和a[j+1]標識,i的值依次爲1,2,...,9,對於每一個i,j的值依次爲1,2,...10-i。
下面代碼編譯通過:
#include <stdio.h>
#define TRUE 1
//以下是冒泡排序的函數定義
void bubblesort(int *a, int n){
int i; //控制外面大循環的變量
int j; //控制內部小循環的變量
int temp = 0; //用於存儲兩數交換時的臨時變量
int flag =0; //用於標記本次循環是否發生交換
//外面的大循環,對於一個長度爲n的數組,需要循環n-1次,當沒有任何比較的時候循環即結束
for(i = 0; i < n-1; i++) {
flag = 0;//初始值爲0,表明剛開始沒有交換髮生
//裏面的小循環,在每一次循環中,比較相鄰兩個元素的大小,把大的元素往後排
for(j = n-1; j > i; j--) {
if(a[j] < a[j-1])
{
//交換兩個相鄰元素
temp = a[j];
a[j] = a[j-1];
a[j-1] = temp;
flag = 1; //當此輪有交換髮生時,繼續比較
}
}
if(flag == 0) //當此輪比較沒有發生交換,則說明比較已經結束
break;
}
}
int main() {
int a[10] = {5,1,6,9,8,3,4,6,10,7};//待排序整形數組
int i = 0;
for(i=0;i < 10;i++)
printf("%d,",a[i]);
printf("\n");
bubblesort(a, 10); //調用冒泡排序算法
for(i=0;i < 10;i++)
printf("%d,",a[i]);
return TRUE;
}