冒泡排序(从小到大)
算法思想:遍历一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;
}