c++冒泡排序算法实现
冒泡排序,是一种计算机科学领域的较简单的排序算法。它通过遍历要排序的元素,依次比较相邻元素的大小,如果前面的元素大于后面的元素,则交换两个元素的位置。因此,在第一趟遍历完成时,会把最大的元素排在最末尾,第二趟遍历完成时,会把次大的元素排在倒数第二位,依次类推直到要排序的元素以升序的方式排列。由于该过程类似于鱼吐的泡泡一样向上浮,所以冒泡排序也由此得名。
接下来来看一下c++如何实现冒泡排序的。
#include <iostream>
using namespace std;
int main()
{
int a[10] = {2,11,4,1,5,18,13,10,15,8};
cout << "数组中的数分别是:";
for(int i = 0;i<10;i++)
cout << a[i] << " ";
cout << endl;
for(int i = 0;i<9;i++)
{
for(int j = 0;j<9-i;j++)
{
int temp = 0;
if(a[j]>a[j+1])//如果前面的元素大于后面的元素,则交换位置
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
cout << "第" << i << "轮排序之后:";
for(int k =0;k<10;k++)
{
cout << a[k] << " ";
}
cout << endl;
}
cout << "排序之后数组如下:";
for(int i = 0;i<10;i++)
cout << a[i] << " ";
cout << endl;
return 0;
}
运行代码,结果如下:
从排序的结果可以看出,从最大数,次大数…等会依次被放置在正确的位置上。当然再仔细观察一下,可以看出在第4(从0开始算)轮排序之后,所有的数据都已经被排好序了,所以第4轮之后的所有排序都是无用功。因此这里可以想一下,是否可以判断数据有序时,提前结束排序呢?这种判断的依据是什么呢?
很显然,当某一轮遍历完成时,没有进行交换数据位置的操作,就可以说明数据是有序的。因此可以增加一个标志位,来记录是否有进行数据交换。改进的冒泡排序具体实现如下:
#include <iostream>
using namespace std;
int main()
{
bool flag = false;
int a[10] = {2,11,4,1,5,18,13,10,15,8};
cout << "数组中的数分别是:";
for(int i = 0;i<10;i++)
cout << a[i] << " ";
cout << endl;
for(int i = 0;i<9&&!flag;i++)
{
flag = true;
for(int j = 0;j<9-i;j++)
{
int temp = 0;
if(a[j]>a[j+1])
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
flag = false;
}
}
cout << "第" << i << "轮排序之后:";
for(int k =0;k<10;k++)
{
cout << a[k] << " ";
}
cout << endl;
}
cout << "排序之后数组如下:";
for(int i = 0;i<10;i++)
cout << a[i] << " ";
cout << endl;
return 0;
}
运行代码,结果如下:
在第四轮排序之后可以看到数据已经有序了,再进行第五轮遍历时,没有进行交换数据的操作,所以设定的flag = true,此时再进行i<9&&!flag的判断时,条件不成立,可以提前结束排序,以免再有多余的遍历和比较的过程。
感兴趣的朋友们可以关注我,一起学习C++吧!