#include<stdio.h>
void Swap(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}
void BubbleSort(int a[],int n)
{
for(int i=1;i<n;i++)
{
for(int j=0;j<n-i;j++)
{
if(a[j]>a[j+1])
{
Swap(a[j],a[j+1]);
}
}
}
}
int main()
{
int a[10];
for(int i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
BubbleSort(a,10);
for(int i=0;i<10;i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
改进1:如果算法在某趟的执行过程中,没有交换任何元素,那么说明这些元素已经就序了,那么就可以退出了。
改进2: 试想想如果存在这种情况,在给定的一串数据中,数据的后半部分是有序的,前半部分是无序的,并且后半部分的数据都比前半部分的要大,那么我们还需要对后面的数据进行比较和处理吗?答案是否定的,对于这种情况,我们可以在每趟记录一个最后交换的数据元素的角标j,这样我们可以把排序长度变成j,这样就可以对后边数据有序的情况及时的更新。
void BubbleSort(int *a,int n)
{
int len=n;
int hot=0;
int i=-1;
while (++i<n)
{
hot=-1;
for (int j=1; j<len; j++)
{
if (a[j]<a[j-1])
{
swap(a[j], a[j-1]);
hot=j;
}
}
if (hot==-1)
break;
len=hot;
}
}