解题思想:假设待排序的数据都存放在数组
R[n]
中,并想象将数组垂直树立,每次将相邻的两个元素比较,把小的元素调到前面,一趟排序后,最大的元素已放到了数组最后(沉底),小的元素向前一个位置(上浮),按此规律进行下去,直到没有反序记录为止。
解题过程:
起泡排序是交换排序的一种,其基本方法是
:
设待排序元素列中元素的个数为
n
,首先比较下标为
n-2
和
n-1
个元素,如果发生逆序(及前一个大于后一个),则将这两个元素交换;
然后对下标为
n-3
和
n-2
的元素做同样的处理;重复此过程直到处理完下标为
0
和
1
的元素。这称之为一趟起泡,结果将最小的元素交换到待排序元素序列的第一个位置,其他元素也都向最终排序的方向移动。
当然在个别情形下,元素有可能在排序中途向相反的方向移动(两元素相等时,不稳定排序,如图一中的
25
和
25*
)。这样最多做
n-1
趟起泡就能把所有元素排好序。
代码实现:
#include<stdio.h>
//
起泡排序
void
BubbleSort
(int r[],int n){
int
j,temp,bound,exchange
=n-1;
while(exchange!=0){
bound=exchange;
exchange=0;
for(j=0;j<
bound;j
++)
if(r[j]>r[j+1])
{
temp=r[j];r[j]=r[j+1];r[j+1]=temp;
exchange=j;
}
}
}
int main(){
int i;
int r[]={50,13,55,97,27,38,49,65};
printf("待排序数组为:\n");
for(i=0;i<8;i++){
printf("%4d",r[i]);
}
printf("\n");
printf("起泡排序结果为:\n");
BubbleSort(r,8);
for(i=0;i<8;i++){
printf("%4d",r[i]);
}
return 0;
}