冒泡法的基本原理:
1.给定n个数,从第一数字开始依次对相邻的两个数进行比较,当前面的数字大于后面的数字时,就交换位置。
2.经过一轮比较后,最大的数字将位于数组的最右边,即第n位。
3.然后对n-1位数字进行第二轮比较,直到剩下一个数字为止。
分析:
1.从看到n个数,就知道这是需要用到for循环的。
2.接下来就要需要思考,需要几个for循环呢?一般如果一个数字与其他数字进行比较的话,就是单个for循环,需要这种两两比较的话,就需要比较N趟,每趟N次,所以需要两个for循环。
3.好,确定了是两个for循环了。在这种嵌套循环中,关键是确定边界值,也就是两for循环的界限。
for(i=0;i<n;++i)
for(j=0;j< ;j++)
空出的是第二个循环的边界,那怎么确定呢?就看我们比较了,我们在第一趟比较完成后,就确定了一个最大数,那第二趟只需要比较N-1个数就可以了,第三趟只需要比较N-2个数。
这样的话,就可以确定出嵌套循环中的边界是n-i了。
所以for循环为
for(i=0;i<n;++i)
for(j=0;j<n-i;j++)
4.再循环中做什么呢?两两数字进行比较。若前一个数大于后一个数,则交换两者,即if(a[j]>a[j+1]) {swap(a[j],a[j+1])};
完整实例:
#include<stdio.h>
void Swape(int& a,int& b) //注意使用数组跟指针一样,需要地址符,不然实参没有传递
{ int temp;
temp =a;
a=b;
b=temp; }
void BubbleSort(int* a,int n)
{
for(int i=0;i<n;i++)
for(int j=0;j<n-i-1;j++)//注意这个边界,应该是n-i-1,因为下面是a[j+1]。不然会超出边界。
{
if(a[j]>a[j+1])
{ Swape(a[j],a[j+1]); }
}
}
int main()
{ int a[]={3,4,6,2,7,1};
int len = sizeof(a)/sizeof(a[0]);
BubbleSort(a,len);
for(int i=0;i<len;++i)
{ printf("%d",a[i]); }
return 0;
}