冒泡排序我想初学编程的人都很熟悉,是我们大家最常使用到的,也是最简单的排序,所以我也不过多的介绍了。
冒泡排序属于交换排序是稳定的排序;
时间复杂度:最好情况:O(n) 最坏情况O(n2) 平均情况O(n2)
空间复杂度:O(1)
它的排序思想也很简单我们简单介绍一下:对于N个数据,从第一个数据开始依次对相邻的两个数据进行比较,
按照从小到大的书顺序,如果前面数据大于后面的进行交换,进行一轮后,最大的数据位于最后,然后对前N-1
个数据进行第二轮比较,直到只剩下的数据为1个为止。这就像气泡一样,轻气泡不能在重气泡之下的原则,开
始从下往上冒。
代码如下:
#include <stdio.h>
void SortBubble(int par_array[], int length)
{
int i,j ,temp;
for (i = 0; i < length-1; i++)
{
for (j = 0; j <length-1-i; j++) //从前往后 找最大 要注意j的范围要减去i
{
if (par_array[j] > par_array[j+1])
{
temp = par_array[j+1];
par_array[j+1] = par_array[j];
par_array[j] = temp;
}
}
}
}
void BubbleSort(int par_array[], int length)
{
int i,j, temp;
for (i = 0; i < length - 1; i++)
{
for (j = length - 1; j >= i; j--) //从后往前 找最小
{
if (par_array[j] < par_array[j-1])
{
temp = par_array[j];
par_array[j] = par_array[j-1];
par_array[j-1] = temp;
}
}
}
}
int main1()
{
int i;
int a[] = {2, 1, 3, 8, 9, 0, 7, 4, 5, 6};
int len = sizeof(a) / sizeof(a[0]);
//BubbleSort(a, len);
SortBubble(a, len);
for (i = 0; i < len; i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
好了具体程序我不多说了 下面我想到一个小问题,:假如进行第 i 次扫描前数组已经排好了,但是它还会进行下一次的扫描,显然以后的扫描都是没必要的,
那么该怎样解决呢?
我想带可以用一个局部变量 exchange 来记录本次扫描时有没有进行交换数据, 每次扫描之前 把 exchange 置为 0, 如果扫描时发生数据交换,则置为1,
如果没有则说明已经排序完了则不需要进行下一轮了。