冒泡排序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了冒泡排序相关的知识,希望对你有一定的参考价值。
冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后.至此第一趟结束,将最大的数放到了最后.在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数).如此下去,重复以上过程,直至最终完成排序.
1.原始的冒泡排序算法
void BubbleSort1 (DataType a,int n)
{
for (i=n;i>1;i--)
{
for (j=1;j<=i-1;j++)
if(a[j].key>a.[j+1].key)
{
temp=a[j];a[j]=a[j+1];a[j+1]=temp;
}
}
}
2.改进的冒泡排序算法
在冒泡排序过程中,一旦发现某一趟没有进行交换操作,就表明此时待排序记录序列已
经成为有序序列,冒泡排序再进行下去已经没有必要,应立即结束排序过程。
void BubbleSort2 (DataType a,int n)
{
for (i=n;i>1;i--)
{
exchange=0;
for (j=1;j<=i-1;j++)
if (a[j].key>a.[j+1].key)
{
temp=a[j];a[j]=a[j+1];a[j+1]=temp;exchange=1;
}
if (exchange==0) break;
}
}
3.进一步地改进冒泡排序算法
在上面给出的冒泡排序算法的基础上,如果同时记录第i趟冒泡排序中最后一次发生交换操作的位置m(m<=n-i),就会发现从此位置以后的记录均已经有序,即无序区范围缩小在a[1]~a[m]之间,所以在进行下一趟排序操作时,就不必考虑a[m+1]~a[n]范围内的记录了,而只在a[1]~a[m]范围内进行
void BubbleSort3 (DataType a,int n)
{
last=n-1;
for (i=n;i>1;i--)
{ exchange=0;
m=last; //初始将最后进行记录交换的位置设置成i-1
for (j=1;j<=m;j++)
if(a[j].key>a.[j+1].key)
{
temp=a[j];a[j]=a[j+1];a[j+1]=temp;
exchange=1;
last=j; //记录每一次发生记录交换的位置
}
if (exchange==0) break;
}
}
以上是关于冒泡排序的主要内容,如果未能解决你的问题,请参考以下文章