冒泡排序的基本思想、基本操作、代码实现以及性能分析总结

冒泡排序

1,基本思想
将待排序的元素进行两两比较,如果存在逆序,就对其进行交换操作,直到所有的元素的顺序都排好。

2,基本操作
对于待排序序列中的n个元素,第i趟冒泡排序从1到n-i+1依次比较相邻两个记录的大小,如果存在逆序关系,就交换;最后在这从1到n-i+1个元素中,最大(我们默认排序结果为从小到大)的元素被交换到第n-i+1的位置。

可以看出,在第i趟排序时前n-i+1个元素是处于无序状态,第n-i+2到n的元素处于从小到大的有序状态,第i个元素为待排序元素。

第i趟排序时,是在对0~n-i位置的元素进行排序,此趟排序后将这个范围内最大的交换到n-i号位置,同时其他元素也都在向排序的最终位置移动。

举例说明,请参考其他更加详细的文章。(本文章是总结性质的)

3,代码实现

void bubbleSort(int data[], int n)
{
	int i = 0;
	bool exchange = true;//是否交换标志位,当此趟没有交换时说明排序成功,后续不用再执行
	while (i < n - 1 && exchange)//n个元素需至多执行n-1次
	{
		exchange = false;
		for (int j = 0; j < n - i-1; ++j)//比较前n-i-1个元素,找最大值
		{
			if (data[j] > data[j + 1])//将存在逆序的元素进行交换
			{
				int temp = data[j + 1];
				data[j+1] = data[j];
				data[j] = temp;
				exchange = true;
			}
		}
		++i;
	}
}
int main()
{
	int data[] = { 6,3,5,8 ,1,7,4,9,2};
	cout << "排序前:"<<endl;
	for (int i : data)
		cout << i << " ";
	cout << endl << endl;

	cout << "每趟排序后:" << endl;
	bubbleSort(data, 9);

	cout << endl<<endl;
	cout << "排序后:" << endl;
	for (int i : data)
		cout << i << " ";

	return 0;
}

运行结果:
冒泡排序的基本思想、基本操作、代码实现以及性能分析总结_第1张图片
4,性能分析
①最好情况
元素的初始序列已经按照从小到大的顺序排列好,此算法就只执行一趟排序(由于算法中存在exchange变量,本趟排序没有元素交换时,说明元素排好,算法执行完毕);此时,算法比较n-1次而不发生元素移动。
综上,时间复杂度为O(n)

②最坏情况
元素的初始序列为逆序排列即按照从大到小的属顺序,该算法执行n-1趟排序,且每趟做n-i次比较并执行n-i次元素交换。
比较次数=n-1+n-2+…1=n(n-1)/2
移动次数=3(n-1+n-2+…+1)=3n(n-1)/2(交换一次移动三次)
综上,时间复杂度为O(n^2)

③平均时间复杂度
O(n^2)

④空间复杂度
O(1),即就地排序

⑤稳定性
稳定,排序前后相同元素的相对位置不发生改变。

你可能感兴趣的:(算法,数据结构,排序算法,c++)