其他分享
首页 > 其他分享> > 冒泡排序

冒泡排序

作者:互联网

冒泡排序
排序的基本概念
排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。分内部排序和外部排序,若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序。反之,若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序。内部排序的过程是一个逐步扩大记录的有序序列长度的过程。 。
排序的基本概念
排序前 12 85 96 45 88 13 64 63
排序后(升序)  12 13 45 63 64 85 88 96
排序后 (降序) 96 88 85 64 63 45 13 12
常见排序算法
快速排序、希尔排序、堆排序、直接选择排序不是稳定的排序算法,而基数排序、冒泡排序、直接插入排序、折半插入排序、归并排序是稳定的排序算法。
排序的基本概念
稳定排序:假设在待排序的文件中,存在两个或两个以上的记录具有相同的关键字,在用某种排序法排序后,若这些相同关键字的元素的相对次序仍然不变,则这种排序方法是稳定的。其中冒泡,插入,基数,归并属于稳定排序,选择,快速,希尔,堆属于不稳定排序。
第一次冒泡过程
[23 89 34 12 34 67 90 43]
两两比较相邻两数的大比如果逆序进行交换
[23 89 34 12 34 67 90 43]
[23 34 89 12 34 67 90 43]
[23 34 12 89 34 67 90 34]
[23 34 12 34 89 67 90 34]
[23 34 12 34 67 89 90 34]
[23 34 12 34 67 89 34] 90
第二次冒泡过程
[23 34 12 34 67 89 34] 90
[]两两比较相邻两数的大比如果逆序进行交换
[23 34 12 34 67 89 34] 90
[23 12 34 34 67 89 34] 90
[23 12 34 34 67 89 34] 90
[23 12 34 34 67 89 34] 90
[23 12 34 34 67 89 34] 90
[23 12 34 34 67 34]89 90
代码:

#include<iostream>
using namespace std;
int a[1000];
int n;
int main()
{
	cin>>n;
	for (int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	for (int i=0;i<n;i++)
	{
		for(int j=0;j<n-i-1;j++)
		{
			if (a[j]>a[j+1])
			{
				swap(a[j],a[j+1]);
			}		
		} 
	}
	for (int i=0;i<n;i++)
	{
		cout<<a[i]<<" ";
	}
}
/*
8
2 1 3 4 5 6 7 90

8
23 89 34 12 34 67 90 43
*/ 

  


思考
要进行几次冒泡过程?
每次冒泡的范围是什么?
如果进行优化?
时间复杂度O(n2)
当有序时改进的冒泡排序的时间复杂度为O(n)。
当反序时改进的冒泡排序的时间复杂度为O(n2)
基本思想
一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
算法稳定性
冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

标签:12,23,冒泡排序,34,89,67,排序
来源: https://www.cnblogs.com/smghj/p/15983458.html