前言
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
冒泡排序原理
冒泡排序算法的原理如下:
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
一句话来说:
两两比较,如果前边大于后边,则交换
用一个变量从0号下标开始遍历,如果 arr[j]>arr[j+1] 那么就交换arr[j]和arr[j+1] ,然后使变量++;
首先比较 2 和 21 发现 2 < 21 然后 j ++
此时 21 大于 12 ,交换 21 与 12, 然后 j ++
以此类推,直到比较完第一趟
j+1必须合法,不可以越界
此时最后一个数据已经保证是最大的了,第一趟比较完一共比较了9次
然后开始第二趟,这时候第二趟只用比较八次
依次类推,直到第九趟比较完,完成排序
第十趟不需要存在,因为一共有十个数据,我们已经跑了九趟,帮助了九个值确定了他所在的位置,那剩余的一个值就已经在他所在的位置上了
优化
如果遍历一遍,发现左边的数据都小于右边的数据,则没有发生交换,此时可以断定数据完全有序
第二趟的时候,发现遍历了一遍,一直都是后边大于前边没有发生交换(可以通过标记实现),此时可以断定已经完全有序,可以直接返回。
代码实现
//冒泡排序:时间复杂度O(n^2) 空间复杂度O(1) 稳定性:稳定
void BubbleSort(int *arr, int len)
{
int count = 0;
bool tag = true;
for(int i=0; i<len-1; i++)//需要的趟数
{
tag = true;
for(int j=0; j+1<len-i; j++)//这里处理数据两两比较的,j代表比较的左边数据的下标,则j+1代表右边的
{
if(arr[j] > arr[j+1])
{
tag = false;
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
count++;
if(tag)//如果此时tag还为真,则上边的if从来没有为真过,则不存在交换
{
break;
}
}
printf("跑了%d趟\n", count);
}