冒泡排序是最基础的一种排序方式,也是初学者必须要掌握的排序方法之一。它的工作原理主要是重复地走过待排序的列表,每次比较两个元素,如果它们的顺序位置不对,则互换两个元素的位置,直到没有一对元素的位置可换,即排序成功。它每次比较都可以确定一个最大(从小到大排序)或者确定一个最小的元素(从大到小),因此可以循环n-1趟即可对n个元素成功进行排序。仔细分析如下:
第一趟,从第一个元素,直到最后一个元素,每两个元素进行比较,得到最大的元素在最后一个位置(从小到大);
第二趟,从第一个元素,直到倒数第二个元素(最后一个元素是最大的),得到次最大的元素;
。。。。。。
第n-1趟,从第一个元素,到第2个元素进行比较,这样全部数据都排序有序。
核心比较代码如下:
for (i = 0; i < n - 1; i++)//趟数,一共是N-1趟
{
for (j = 0; j < n - 1 - i; j++)//每次进行比较的次数
{
if (a[j] > a[j + 1])//交换两个数的
{
int tmp = a[j];
a[j] = a[j + 1];
a[j + 1] = tmp;
}
}
}
冒泡排序是一种稳定的排序(如果两个数相同,不改变它们原来的顺序)。时间复杂度为O(n2),属于交换排序,需要一个辅助存储。
下面是整个完整的程序,运行平台vs2013。
#include<iostream>
using namespace std;
//功能:数组输出
//入参:数组指针,数组的长度
void printArray(int *a, int len)
{
if (a == NULL || len <= 0)
{
return;
}
int i;
for (i = 0; i < len; i++)
{
cout << a[i] << " ";
}
cout << endl;
}
//冒泡核心算法
void BubbleSort(int *a, int n)
{
if (a == NULL || n <= 1)
{
return;
}
int i, j;
for (i = 0; i < n - 1; i++)
{
for (j = 0; j < n - 1 - i; j++)
{
if (a[j] > a[j + 1])
{
int tmp = a[j];
a[j] = a[j + 1];
a[j + 1] = tmp;
}
}
}
}
void main()
{
int a[] = { 23, 45, 91, 2, 45, 98, 12 };
int len = sizeof(a) / sizeof(a[0]);//数组的长度
printArray(a,len);//输出原数组
BubbleSort(a, len);//数组排序
printArray(a, len);
system("pause");
}
共同学习,一起进步!如有不足之处,请指出,谢谢!