1. 直观的想法
一个直观的想法是从第一个位置开始,用这个位置的元素与后面的每一个元素进行比较,如果后面的数字比这个数字小的话,就将它调换到前面,具体过程如下图所示的初始数组
相当于将第一个位置的元素与之后的每一个元素进行比较,选出最小的最为第一个位置的元素。具体来说,首先 5 比 2 大,将 2 ,5 的位置互换。
之后 2 比 6 小不用动,而 2 比 0 小,所以 2 , 0 再一次互换,就这样一直找到下标为 0 的元素,然后使用同样的方法找到下标为 1 的最小值,当确定最后一个下标所对应的元素之后,排序就完成了。
具体如下代码
#include <stdio.h>
void BubbleSort(int k[], int n)
{
int i, j, temp, count1=0, count2=0;
for( i=0; i < n-1; i++ )
{
for( j=i+1; j < n; j++ )
{
count1++;
if( k[i] > k[j] )
{
count2++;
temp = k[j];
k[j] = k[i];
k[i] = temp;
}
}
}
printf("总共进行了%d次比较,进行了%d次移动!", count1, count2);
}
int main()
{
int i, a[10] = {1, 0, 2, 3, 4, 5, 6, 7, 8, 9};
BubbleSort(a, 10);
printf("排序后的结果是:");
for( i=0; i < 10; i++ )
{
printf("%d", a[i]);
}
printf("\n\n");
return 0;
}
2. 冒泡算法
冒泡排序的基本思想:两两相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。两两注意是相邻的两个元素的意思。如果有n个元素需要比较n-1次,每一轮减少1次比较。既然叫冒泡排序,那就是从下往上两两比较,所以看上去就跟泡泡往上冒一样。
举一个具体的例子,假如原始的数组如下所示
冒泡法实际上是从大到小开始比较,当 i = 0 的时候确定的是最上面的元素(即最小的元素),从下向上数组两两比较,如果下面的数比上面的数小则互换两个数的位置,那么 0 是比剩下的所有的数都要小的,所以最后一定会到最上面,因此最小的数字会最先到上面浮出来,所以形象地称之为冒泡法。
具体如下代码
#include <stdio.h>
void BubbleSort(int k[], int n)
{
int i, j, temp, count1=0, count2=0;
for( i=0; i < n-1; i++ )
{
for( j=n-1; j > i; j-- )
{
count1++;
if( k[j-1] > k[j] )
{
count2++;
temp = k[j-1];
k[j-1] = k[j];
k[j] = temp;
}
}
}
printf("总共进行了%d次比较,进行了%d次移动!", count1, count2);
}
int main()
{
int i, a[10] = {5, 2, 6, 0, 3, 9, 1, 7, 4, 8};
BubbleSort(a, 10);
printf("排序后的结果是:");
for( i=0; i < 10; i++ )
{
printf("%d", a[i]);
}
printf("\n\n");
return 0;
}
3. 冒泡算法的改进
冒泡算法可以进行一些改进,比如说当遇到如下的情况
如果 0,1 互换了位置之后,当 i = 1 的时候,执行了一次比较之后,没有发生调换证明顺序已经顺序定好了,就不用执行下面的操作了。
#include <stdio.h>
void BubbleSort(int k[], int n)
{
int i, j, temp, count1=0, count2=0, flag;
flag = 1;
for( i=0; i < n-1 && flag; i++ )
{
for( j=n-1; j > i; j-- )
{
count1++;
flag = 0;
if( k[j-1] > k[j] )
{
count2++;
temp = k[j-1];
k[j-1] = k[j];
k[j] = temp;
flag = 1; //如果在一次循环中没有执行过互换数值,证明排序已经完成,就不会使 flag = 1;
}
}
}
printf("总共进行了%d次比较,进行了%d次移动!", count1, count2);
}
int main()
{
int i, a[10] = {5, 2, 6, 0, 3, 9, 1, 7, 4, 8};
BubbleSort(a, 10);
printf("排序后的结果是:");
for( i=0; i < 10; i++ )
{
printf("%d", a[i]);
}
printf("\n\n");
return 0;
}