冒泡排序的基本思路是:每次将相邻两个数比较,将小的调到前头(本例按照从小到大排序)。按此规律如果有n个数,则要进行n-1趟比较。在第1趟比较中要进行n-1次两两比较,在第 j 趟比较中要进行 n-j 次两两比较。实现如下:
#include <stdio.h>
#define N 10
int main()
{
int a[N];
int i, j, temp, count = 0;<span style="white-space:pre"> </span>/* count 为比较的总次数 */
for(i = 0; i < N; i++)
scanf("%d", &a[i]);
for(i = 0; i < N - 1; i++)
{
for(j = 0; j < N - 1 - i; j++)
{
count++;
if(a[j + 1] < a[j])
{
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
for(i = 0; i < N; i++)
printf("%d ", a[i]);
printf("\ncount = %d\n", count);
return 0;
}
冒泡排序可以优化,即当发现没有进行交换,证明当前序列已经有序结束循环。
#include <stdio.h>
#define N 10
int main()
{
int a[N];
int i, j, temp, count = 0;
int flag = 1; /* 首先假定无序 */
for(i = 0; i < N; i++)
scanf("%d", &a[i]);
for(i = 0; i < N - 1 && flag; i++)
{
flag = 0; /* 经一趟比较后如果没有发生交换,证明序列有序,下一趟可结束循环 */
for(j = 0; j < N - 1 - i; j++)
{
count++;
if(a[j + 1] < a[j])
{
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
flag = 1; /* 进行过交换,证明序列无序<span style="font-family: tahoma, arial, sans-serif;">,需要进行排序 </span>*/
}
}
}
for(i = 0; i < N; i++)
printf("%d ", a[i]);
printf("\ncount = %d\n", count);
return 0;
}
经过优化后,会在某些情况下排序的次数明显较少。例如5, 4, 1, 2, 3 优化之前需要两两比较10次,优化之后只需9次,如果此类情况数据长度庞大,次数减少更多。