【正确答案】
【答案解析】冒泡排序顾名思义就是整个过程就像气泡一样往上升,单向冒泡排序的基本思想是(假设由小到大排序):对于给定的n个记录,从第一个记录开始依次对相邻的两个记录进行比较,当前面的记录大于后面的记录时,交换其位置,进行一轮比较和换位后,n个记录中的最大记录将位于第n位;然后对前(n-1)个记录进行第二轮比较;重复该过程直到进行比较的记录只剩下一个时为止。
以数组{36,25,48,12,25,65,43,57}为例,具体排序过程如下:
一趟排序的过程如下:
R[1]36 25 25 25 25 25 25 25
R[2]25 36 36 36 36 36 36 36
R[3]48 48 48 12 12 12 12 12
R[4]12 12 12 48 25 25 25 25
R[5]25 25 25 25 48 48 48 48
R[6]65 65 65 65 65 65 43 43
R[7]43 43 43 43 43 43 65 57
R[8]57 57 57 57 57 57 57 65
则经过多趟排序后的结果如下:
初始状态:[36 25 48 12 25 65 43 57]
1趟排序:[25 36 12 25 48 43 57 65]
2趟排序:[25 12 25 36 43 48]57 65
3趟排序:[12 25 25 36 43]48 57 65
4趟排序:[12 25 25 36]43 48 57 65
5趟排序:[12 25 25]36 43 48 57 65
6趟排序:[12 25]25 36 43 48 57 65
7趟排序:[12]25 25 36 43 48 57 65
程序示例如下:
#include<stdio.h>
void Swap(int&a,int&b)
{
int temp;
temp=a;
a=b;
b=temp;
}
void BubbleSort(int array[],int len)
{
int i,j;
for(i=0;i<len-1;++i)
{
for(i=len-1;j>i;-j)
{
if(array[j]<array[j-1])
}
Swap(array[j],array[j-1]);
}
}
}
}
int main()
{
int i=0;
int a[]={5,4,9,8,7,6,0,1,3,2};
int len=sizeof(a)/sizeof(a[0]);
BubbleSort(a, len);
for(i=0;i<len;i++)
printf(%d",a[i]);
printf("/n");
return 0;
}
程序输出结果:
0 1 2 3 4 5 6 7 8 9
引申:如何进行双向冒泡排序?
双向冒泡排序是冒泡排序的一种优化,它的基本思想是首先将第一个记录的关键字和第二个记录的关键字进行比较,若为“逆序”(即L.r[1].key>L.r[2].key),则将两个记录交换,然后比较第二个记录和第三个记录的关键字。依次类推,直至第n-1个记录的关键字和第n个记录的关键字比较过为止。这是第一趟冒泡排序,其结果是使得关键字最大的记录被安置到最后一个记录的位置上。
第一趟排序之后进行第二趟冒泡排序,将第n-2个记录的关键字和第n-1个记录的关键字进行比较,若为“逆序”(即L.r[n-1].key<L.r[n-2].key),则将两个记录交换,然后比较第n-3个记录和n-2个记录的关键字。依次类推,直至第1个记录的关键字和第2个记录的关键字比较过为止。其结果是使得关键字最小的记录被安置到第一个位置上。
再对其余的n-2个记录进行上述同样的操作,其结果是使关键字次大的记录被安置到第n-1个记录的位置,使关键字次小的记录被安置到第2个记录的位置。
一般地,第i趟冒泡排序是:若i为奇数,则从L.r[i/2+1]~L.r[n-i/2]依次比较相邻两个记录的关键字,并在“逆序”时交换相邻记录,其结果是这n-i+1个记录中关键字最大的记录被交换到第n-i/2的位置上;若i为偶数,则从L.r[n-i/2]~L.r[i/2]依次比较相邻两个记录的关键字,并在“逆序”时交换相邻记录,其结果是这n-i+1个记录中关键字最小的记录被交换到第i/2的位置上。整个排序过程需要进行K(1≤K<n)趟冒泡排序,同样判别冒泡排序结束的条件仍然是“在一趟排序过程中没有进行过交换记录的操作”。
程序示例如下:
#include<stdio.h>
void Swap(int&a,int&b)
{
int temp;
temp=a;
a=b;
b=temp;
}
void Bubble2Sort(int array[],int length)
{
int left=1;
int right=length-1;
int t;
do
{
∥正向的部分
for(int i=right;i>=left;i--)
{
if(array[j]<array[i-1])
{
Swap(array[i],array[i-1]);
t=i;
}
}
left=t+1;
∥反向的部分
for(i=left;i<right+1;i++)
{
if(array[i]<array[i-1])
{
Swap(array[i],array[i-1]);
t=i;
}
}
right=t-1;
}while(left<=right);
int main()
{
int i=0;
int a[]={5,4,9,8,7,6,0,1,3,2};
int len=sizeof(a)/sizeof(a[0]);
Bubble2Sort(a, len);
for(i=0;i<len;i++)
printf("%d", a[i]);
printf("/n");
return 0;
}
程序输出结果:
0 1 2 3 4 5 6 7 8 9