冒泡排序(從小到大)
算法思想:遍歷一n個數據的數組,比較相鄰數據的大小,把小值放前面,大值放後面,比較數次後,該組數據由小到大排列。假設最小值在最後一個位置,則須經過n-1次才能把最小值交換到第一位,即比較次數最多爲n-1次。
對於內循環的循環不變式
初始化:第一次遍歷前,in_index之前沒有值,顯然滿足小值在前,大值在後;
保持:第k次遍歷前,in_index = k,在k之前的值均保持小值在前,大值在後;
終止:遍歷n-1次後,比較了所有數據,循環結束,
對於外循環的循環不變式
初始化:第一次遍歷前,out_index之前沒有對數據進行任何操作,即排序後的數據爲空,顯然滿足相鄰之間小值在前,大值在後;
保持:第k次遍歷前,out_index = k,由於內循環的循環不變式,可以證明經過k-1次的操作,數據滿足相鄰之間小值在前,大值在後;
終止:遍歷n-1次,可以保證每一位數據均與另外n-1個數據進行了比較並進行了交換,循環結束。
最壞時間複雜度:O(n2)
代碼如下:
#include <stdio.h>
#define MAXSIZE 10
void print(int array[]);
void bubble_sort(int array[]);
/**
* 打印程序
*/
void print(int array[])
{
int index = 0;
while(index < MAXSIZE)
{
printf("%d ", array[index]);
index ++;
}
printf("\n");
}
/**
* 冒泡排序,從小到大排序
*/
void bubble_sort(int array[])
{
int out_index = 0;//外部循環變量
int in_index = 0;//內部循環變量
int tmp_value = 0;//臨時存儲變量
while(out_index < (MAXSIZE-1))//外部循環
{
in_index = MAXSIZE - 1;
while(in_index > out_index)//內部循環
{
if(array[in_index - 1] > array[in_index])//相鄰變量比較,如果後一個小於前一個,交換
{
tmp_value = array[in_index];
array[in_index] = array[in_index - 1];
array[in_index - 1] = tmp_value;
}
in_index --;
}
out_index++;
}
}
/**
* 主程序
*/
int main()
{
int array[MAXSIZE] = {4,-2,2,0,-1,3,5,1,4,7};//待排序的數組
printf("Oringin array: ");
print(array);
bubble_sort(array);
printf("Sort array: ");
print(array);
return 0;
}