一、算法
Ø冒泡排序是所有排序算法中最简单、最基本的一种。
Ø基本思想:通过相邻数据的交换来达到排序的目的。
Ø排序过程:
(1) 比较第一个数与第二个数,若为逆序a[0]>a[1],则交换;然后比较第二个数与第三个数;依次类推,直至第n-1个数和第n个数比较为止——第一趟冒泡排序,结果最大的数被安置在最后一个元素位置上;
(2) 对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在第n-1个元素位置;
(3) 重复上述过程,共经过n-1趟冒泡排序后,排序结束
二、图解
三、代码
由图可知,冒泡排序需要进行 (n-1)趟,每一趟将一个数放到正确的位置上,下一次比较次数减一,第一趟需要进行(n-1)次比较,第二趟需要进行(n-2)趟,第 i 趟需要进行(n-i)次比较。我们用for循环实现代码,一共二层,外层循环控制趟数,内层循环控制比较次数。
#include<stdio.h>
#define N 10
int main()
{
int i, j, a[N], temp;//temp用于交换数字
for(i = 0; i < N; i++)
{
scanf("%d",&a[i]);
}
for(i = 0; i < N - 1; i++)//外层循环控制趟数 N-1
{
for(j = 0; j < N - i - 1; j++)//内层循环控制比较次数 N-i-1
{
if(a[j] > a[j+1])
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
//如果前一个数大于后一个数,则交换
}
}
//输出排序好的数组
for(i = 0; i < N; i++)
{
printf("%d ",a[i]);
}
return 0;
}
四、程序优化(不要求掌握,一般冒泡排序用上面的程序就足够了)
对于这样的序列 2 1 3 4 5,内循环进行一轮后,序列变成了 1 2 3 4 5,已经排好了,但对于这样一个已经排好的序列,仍需要进行(n-1)趟,我们可以在这里进行优化处理一下。
对冒泡排序的改进:
Ø当一次冒泡过程中发现没有交换操作时,表明序列已经排好序了,便终止冒泡操作。
Ø为了标记在比较过程中是否发生了数据交换,在程序中设立一个标志变量flag,在每趟比较前,把flag变量置为0,如果在这趟比较过程中发生了交换,把变量flag的值置为1。
Ø**在这一趟比较结束后判断如果flag变量取值等于0表示可以结束排序过程,否则进行下一趟比较。 **
#include<stdio.h>
#define N 10
int main()
{
int i, j, a[N], temp, flag = 1;//temp用于交换数字
for(i = 0; i < N; i++)
{
scanf("%d",&a[i]);
}
for(i = 0; flag && i < N - 1; i++)//外层循环控制趟数 N-1
{
flag = 0;
for(j = 0; j < N - i - 1; j++)//内层循环控制比较次数 N-i-1
{
if(a[j] > a[j+1])
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
flag = 1;
//如果发生了交换,flag赋为1,如果没有,flag仍为0,跳出循环
}
//如果前一个数大于后一个数,则交换
}
}
for(i = 0; i < N; i++)
{
printf("%d ",a[i]);
}
return 0;
}
程序优化这种思想可以多加锻炼,虽然在这里可能没怎么优化,但是有了这种思想,我们写出的程序就会越来越高效