冒泡排序是最简单的交换排序方法。
基本算法思想:首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序( L.r[1].key>L.r[2].key ),则将两个记录交换之,然后比较第二个记录和第三个记录的关键字。依此类推,直至第n-1个记录和第n个记录的关键字进行过比较为止。上述过程称为第一趟冒泡过程,其结果使得关键字最大的记录被安置到最后一个记录的位置上。然后进行第二趟冒泡排序,对前n-1个记录进行同样操作,其结果是使关键字次大的记录被安置到第n-1个记录的位置上。一般地,第i趟冒泡排序是从 L.r[1] 到 L.r[n−i+1] 依次比较相邻李娜改革记录的关键字,并在“逆序”时交换相邻记录,其结果是这n-i+1个记录中关键字最大的记录被交换到第n-i+1的位置上。
整个排序过程需进行k( 1≤k<n )趟冒泡排序,显然判别冒泡排序结束的条件应该是在一趟排序过程中没有进行过交换记录的操作。右下图可见,在冒泡排序的过程中,关键字较小的记录好比水中气泡逐趟向上漂浮,而关键字较大的记录好比石块往下沉,每一趟有一块“最大”的石头沉到水底。
- 实现源码
#define TRUE 1
#define FALSE 0
#define N 8
typedef int Status;
void bubble_sort(int a[],int n)
{ /* 将a中整数序列重新排列成自小至大有序的整数序列 */
int i,j,t;
Status change;
for(i=n-1,change=TRUE;i>1&&change;--i)
{
change=FALSE;
for(j=0;j<i;++j)
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
change=TRUE;
}
}
}
void print(int r[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%d ",r[i]);
printf("\n");
}
void main()
{
int d[N]={49,38,65,97,76,13,27,49};
printf("排序前:\n");
print(d,N);
bubble_sort(d,N);
printf("排序后:\n");
print(d,N);
}
- 测试结果