用C++实现冒泡排序

来源:互联网 发布:剑三怎么捏脸数据 编辑:程序博客网 时间:2024/05/18 00:42

本文原创,转载请注明出处(羅小亮博客)。如果本文如果有雷同观点,纯属巧合。如果有引述他人成果,必会给出处。


首先,冒泡排序的核心思想是两两相邻记录的关键字进行比较,将小的值置换在大的值前面。C++代码实现如下:
#include <iostream>
using namespace std;
void BubbleSort(int a[],int n);
int main()
{
int a[10]={5,9,4,3,8,1,2,6,7,0};
BubbleSort(a,10);
for(int i=0;i<10;++i)
{
cout <<a[i];
}
cout << endl;
system("pause");//在vs2008中运行,是为了让窗口停留
return 0;
}
void BubbleSort(int a[],int n)
{
int i;
int j;
int temp;
bool k=true; //k的作用下面再解释
for(i=0;(i<n-1)&&k;++i)
{
k=false;
for(j=n-1;j>0;--j)
{
if(a[j]<a[j-1])
{
temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
k=true;
}
}
}
}
  • 对k的解释如下,当出现如下序列:0,1,2,3,4,5,6,7,8,9时,这个序列已经排好了,也就是说无需进行冒泡排序(因为如果还像冒泡排序一样比较的话则会影响效率)。其实很容易理解,当进行第一次外循环时k满足true,则进入循环体,这时k被置为false。此时,进入内循环,如果是出现像上述那样已经排好的序列,那么if循环体则不会执行,也就是说k不会被置为true。那么跳出内循环后,外循环因不满足条件也跳出循环,所以 k的使用原理就是这样,是外循环不需要完全执行n-2次就提前结束了。
  • 上述是一开始就已经排好序了。如果一开始没排好序,但是在外循环结束之前就已经排好序的话,那么k的作用也可以直接避免继续的无谓的循环。例如:1,0,2,3,4,5,6,7,8,9。外循环只需要进行一次,那么序列就变成0,1,2,3,4,5,6,7,8,9。这个时候再进入循环,那么原理和上面一样,不会再执行If语句,那么k被置为false,外循环提前结束。这次外循环也不需要完全执行n-2次就提前结束了。