冒泡排序
1.思路原理
-
冒泡排序在C语言中是很经典的一种排序,只要你学过C,那么它的大名你肯定听说过。而面试也非常常见这排序算法,经常会有面试官让你手写冒泡排序。就像我当初毕业时去面试,面试官第一句话就问:你学过C语言吗?写一个冒泡排序来看看。
-
好了,进入正文,我们一起来分析分析冒泡排序的原理,并在文末给出实现的代码。
-
如图所示,采用升序排列的方式。以第一个数为基准数,然后与相邻的数进行比较,如果比他大则交换两数的位置,如果第二个数比第一个数小则不交换位置,此时下标移到第二个数的位置,第二个数再和第三个数比较,以此类推,一轮比较下来,此时,最大的数就别移动到了数组的最后了。下一次就比较第一个到倒数第二个数(此时,最大的数已经位于最后面了,无需参与比较了),第二轮的目的是讲第二大的数移动到倒数第二大的位置。 以此类推,可完成升序排序。
-
可以看出,这个过程就像水中的泡泡从水底浮起的过程。大数慢慢的被交换到后边小数被交换到前边。
-
当然了,若是降序的话则刚好相反,即将最小的数通过冒泡移动到最后一位。
2.实现代码
void bublesort(int a,int len)
{
int i,j;
for(i = 0;i < len-1;i++) //i代表第几轮比较
{
for(j = 0;j <len - 1 - i;j++) //j的取值要注意,每归位一个数,j的最大取值就要减少一位
{
if(a[j] > a[j+1]) //若是降序则这里正好相反
{
a[j] ^= a[j+1]; // 交换二者的值
a[j+1] ^= a[j];
a[j] ^= a[j+1];
}
}
}
}
3. 总结
- 冒泡排序算法整体比较简单,只要体会了思想便可以应用到其他很多方面。
- 同样冒泡排序也可以用来实现字符数组的排序,同整型数组一样。
- 冒泡排序的空间复杂度为:1 + 2 + 3+… + n - 1 =n * (n - 1) / 2
度为:1 + 2 + 3+… + n - 1 =n * (n - 1) / 2 - 时间复杂度为:O(n ^ 2)