排序算法--冒泡排序

1.基本思想:每次比较两个相邻的元素,如果顺序错误,则交换这两个元素的位置。

例如:对5,3,4,9,6这五个数按从小到大排序,先比较第一位数5和第二位数3,则发现顺序错误,故进行交换,交换后则变为3,5,4,9,6,接下来继续比较第二位(5)与第三位(4)……一直到第四位与第五位比较。

2.原理:冒泡排序每趟只能将一个数归位,即第一趟只能将末位上的数归位(第一趟排序后9在末位),第二趟排序只能将倒数第二位的数归位(第二趟排序后6在倒数第二位),第三趟只能将倒数第三位上的数归位(5)……由此可见,对n个数进行排序则需要进行n-1趟。

3.代码:

#include<iostream>

using namespace std;

int bubble_sort(int a[], int len)
{
	for (int i = 0; i < len-1; i++)  //控制趟数
	{	for (int j = 0; j < len - 1 - i; j++)  //每一趟排好一个数,每一趟排序后减去1,则i趟排序后减去i,故为len - 1 - i
		{
            if (a[j] > a[j + 1]) 
			{
				int temp;
                temp = a[j];   //记录次数
                a[j] = a[j + 1];
                a[j + 1] = temp;
            }
		}
	}

	return 0;
}

int main()
{
	int a[] = {5, 3, 4, 9, 6};
	
	bubble_sort(a,5);

	for (int j = 0; j < 5; j++)  //输出排序后的数
	{
		cout << a[j] << " ";
	}

	return 0;
}

4.算法时间复杂度分析:

假设待排序的数组共有n个关键字,分最好情况和最坏情况讨论。
(1)若待排序的数组初始状态是正序的,则不需要排序,只需一趟就可完成排序。关键字的比较次数C和移动次数M分别为n-1和0。故最好情况下时间复杂度为O(n)。
(2)若待排序的数组初始状态是反序的,则需要进行(n-1)趟排序,每趟排序需要进行(n-i)次关键字比较,而每次比较都需记录三次移动(见代码注释记录移动处)。这种情况下比较和移动次数都为最大值:
比较次数C=n(n-1)/2=O(n^2)
移动次数M=3n(n-1)/2=O(n^2)
综上所述,冒泡排序总的平均时间复杂度为(n^2)。

注:
1.(n^2)表示n的平方。
2.若对时间复杂度概念不清楚,参见百度百科此处不再赘述。

    原文作者:排序算法
    原文地址: https://blog.csdn.net/weixin_42704090/article/details/85721695
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞