冒泡排序:
冒泡排序是常见的排序方法
原理:依次比较相邻的两个数,找到最大的排到后面,以此类推,得到排序结果。
基本思路:第一次比较第一个和第二个数,将小的放到左边大的数放在右边;第二次比第二个和第三个数,将较大的排到右边小的排到左边。就这样,直到将整个排序完成结束这个循环。
(这里要添加一个概念:如果相邻的两个数相等不进行交换,那么就称这个排序为稳定排序方式。)
例如下面这个例子:
给定一个要排序的数组【1,5,8,9,7,6,4,3,10,2】
image.png
最后会得到一个排序好的数组。
通过上述的推导可以看出:
一个具有N个数的数组排序时,需要N-1趟,第i趟需要N-i次排序。所以我们就可以利用双重循环来完成这个排序。
例如:
int bubbling_sort(int a[]) {
for (int i = 0; i < number; i++)
for (int j = number; j > i; j--)
if (a[j - 1] > a[j]) {
int temp = a[j - 1];
a[j - 1] = a[j];
a[j] = temp;
}
}
一个算法一定会有优点,我们来说说冒泡排序的优点有哪些:
每进行一趟排序,就会少比较一次,因为每进行一趟排序都会找出一个较大值。如上例:第一趟比较之后,排在最后的一个数一定是最大的一个数,第二趟排序的时候,只需要比较除了最后一个数以外的其他的数,同样也能找出一个最大的数排在参与第二趟比较的数后面,第三趟比较的时候,只需要比较除了最后两个数以外的其他的数,以此类推……也就是说,没进行一趟比较,每一趟少比较一次,一定程度上减少了算法的量。
那么排序算法的时间复杂度是多少呢?
这时候就会有一种特殊情况;
也就是说当冒泡排序只需要一趟就可以完成时,所需要的比较次数最少,所以此时的时间复杂度最小,为O(n)
但是当我们的程序是反序的时候,比较的次数和移动的次数都会变多,所以此时的时间复杂度达到最大值为O(n*n)