冒泡排序是一种稳定的算法,时间复杂度为O(n^2)
原理:
冒泡排序算法的规则如下:
(1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。
(2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,最后的元素是最大的数。
(3)针对所有的元素重复以上的步骤,除了最后一个。
(4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
代码实现:
void BubbleSort(int* a, int length)
{
if (a == NULL || length < 0 || length == 0)
return ;
if (length == 1)
return;
for (int i = 0; i < length - 1; i++)
{
for (int j = 0; j < length - 1 - i; j++)
{
if (a[j] > a[j + 1])
{
int temp;
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
//优化冒泡外侧循环:
/*若原数组有序。例如:1,3,5,7,6;我们还按照原来的方法还是需要跑(N-1)次,浪费时间。因此我们加入了标志位,记录是否进行交换,
先将标志位flag至0;再将标志位在循环中至1;若进入循环标指位改变;在跑完一趟冒泡以后判断标志位,若标志位是0,说明没进行交换操作,
则直接弹出。*/
void BubbleSorter(int a[], int length)
{
for (int i = 0; i < length - 1; i++)
{
int flag = 0;//加入flag标记
for (int j = 1; j < length - 1 - i; j++)
{
if (a[j] > a[j + 1])
{
int temp;
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
flag=1;//发生了交换,不是有序的。
}
}
if (flag==0)//没发生交换,已经是有序,直接跳出。
break;
}
}