冒泡排序的思想:
升序排列:从第一个元素开始,对数组中两两相邻的元素比较,将值较小的元素放在前面,值较大的元素放在后面,一轮比较完毕,一个最大的数沉底成为数组中的最后一个元素,一些较小的数如同气泡一样上浮一个位置。n个数,经过n-1轮比较后完成排序。
(大数下沉,小数上浮)
假定有下标为0~n的n+1个数的序列,要求按升序排列,实现的步骤如下:
(1)从第0个元素开始与后一个比较,如果比后大两元素交换,依次比较到第n个元素,最终将最大的数换入第n个元素中,a(n)不动
(2)重复(1) ,依次比较到第n-1个元素,最终将最大的数换入第n-1个元素中,a(n-1)不动
(3)重复(1) ,依次比较到第n-2个元素,最终将最大的数换入第n-2个元素中,a(n-2)不动
………………………………………
(n)a(0)与a(1)比较,如果a(0)大,与a(1)交换, a(0)最小
算法剖析:
(1)n+1个元素从头依次比较,冒出最大的元素到a(n), ...a(n)不动
a(0) a(1) a(2)…a(n-2) a(n-1) a(n),共做n次比较
(2) n个元素从头依次比较,冒出最大的元素到 a(n-1), .a(n-1)不动
a(0) a(1) a(2)…a(n-2) a(n-1), 共做n-1次比较
(3) n-1个元素从头依次比较,冒出最大的元素到a(n-2), .a(n-2)不动
a(0) a(1) a(2)…a(n-2), 共做n-2次比较
………………………………………
………………………………………
(n)2个元素比较,冒出最大的元素到a(1), . a(0)a(1)不动
a(0)a(1), 共做1次比较
共进行了n轮比较
显然这里涉及两个主要变量,冒泡轮数和比较次数,设从第1个元素开始比较直到把大数换到第i个元素为一轮,即每一轮
显然以上都是啰嗦模式:
根据军训经验,第一课时,教官:“向左看齐,海拔高的往前,……”,以上冒泡排序以讲完。
函数实现一组数据冒泡排序:
void MaoPao( int a[],int len){
int temp=0;
for(int i=0; i<len-1; i++){
for(int j=0; j<len-1-j; j++){
if(a > a[i+1]){ temp=a; a=a[i+1]; a[i+1]=temp; }
}
}
}
int main(){
int b[10]={1,23,34,56,441,123,198,388;669,89};
MaoPao(b, 10);
for(int i=0; i<10; i++){
printf("%d\t",a);
}
}
|
|