冒泡排序法和插入排序法的比较

这几天看到了排序,发现冒泡排序和插入排序这两个简单排序比较相似,在网上查找相关资料发现很多人对这两者的区别都心存疑惑,我也不例外。所以花费了一些时间精力尝试解决一下这个小问题,通过简单分析以及调试代码,对这两种方法进行了比较。

由于算法很简单,在这里不做过多的描述和注释。冒泡排序法和插入排序法的核心思想就是元素交换,虽然整体的结构都是两层的循环嵌套,但是两者的交换过程又不尽相同。

两者的外部循环条件相同,都是从下标最左到下标最右,其不同主要体现在内部循环上。


先附上代码

冒泡排序法:

template
void bubbleSort(vector &a)
{
		for (int p = 1; p <=a.size()-1; ++p)
		{
			bool flag = false;
			for (int j = a.size()-1; j >= p  ; --j)
			{
				if (a[j] < a[j - 1])
				{
					swap(a[j], a[j - 1]);
					flag = true;
				}
			}
			if (flag == false)
				break;
		}	
}

冒泡排序,顾名思义,每一步将第n个最小的元素像冒泡一样推到第n个位置。在冒泡排序中,内部循环j的取值是从size()-1到p,即从最后一个元素开始,到从数组头开始数的第一个未排序的元素(第p步外部循环会使交换后的前p个元素有序,那么第一个未排序的元素下标就是p),只要相邻两个元素中,后面的元素比前面的小,就交换这两个元素,直到在某次循环中没有交换出现,说明数组已经有序,break。

插入排序法:

template
void insertionSort(vector &a)
{
	for (int p = 0; p <= a.size()-1; ++p)
	{
		Comparable tmp = move(a[p]);
		int j;
		for (j = p; j > 0 && tmp < a[j - 1]; --j)
			a[j] = move(a[j - 1]);
		a[j] = tmp;
	}
}


插入排序,顾名思义,每一步将一个元素插入到合适的位置。在插入排序中,先保存a[p],内部循环j的取值是从p到0,只要tmp比a[j-1]小,就将前面的数往后挪,直到tmp>=a[j-1],将tmp,也就是前面保存的a[p]放在a[j]处。n次循环后,前n+1个数有序。插入排序中,每一步的执行所涉及的元素个数只与p有关,不难看出,p=0时,不挪动;p=1时,内部的循环涉及两个元素,p=n时,内部的循环涉及n+1个元素,对最后一个元素进行插入时,内部循环涉及到所有size()个元素。

我们可以这样理解这两个算法:在插入排序中,p=n时,涉及到前n个元素,第n+1个元素到第size()个元素没有任何变化;在冒泡排序中,p=n时,涉及到后size()-n个元素,前n个元素没有任何变化。我可以通俗的总结为:插入排序越往后面,动静越大,因为涉及到的元素越来越多;冒泡排序越往后面,动静越小,因为涉及到的元素越来越少。

在冒泡排序的过程中,数组的前面部分(从第一个元素到某一个元素)和最终排序结果是一致的,因为冒泡排序从初始阶段开始就是涉及整个数组的,所以它可以在最开始就选出整个数组的最小元素;但在插入排序的过程中,数组前面部分是会一直变化的,因为插入排序一开始只涉及很少的一部分元素,在最开始,它只能选取出相对较小的元素。

插入排序相当于一开始数组是空的,然后把一串无序元素按位置的先后顺序一个个往现有的数组中的合适位置插,使之有序。

冒泡排序相当于一开始数组是空的,然后把一串无序元素按大小的先后顺序一个个往现有的数组中放,自然而然的有序。

我们可以看一下运行结果:

冒泡排序法和插入排序法的比较_第1张图片                   

                   插入排序                                                                冒泡排序

为什么一般情况下冒泡排序的外部循环次数少呢?因为其内部循环次数一开始就多,为size()-1,其内部循环次数是递减的,而插入排序内部循环次数开始比较小,为0,是递增的。实现同样的目的,当然是冒泡排序的外部循环次数少一些,但其总的比较次数却不会少哦。举个简单的例子,一组数是6,5,4,3,2,1,另一组数是1,2,3,4,5,6。从第一个数开始累加,累加到大于10就停止。当然是第一组数先达到,只需要两次,值为11,而第二组数却要四次,值为10。但最终都是累加到了10附近。


你可能感兴趣的:(冒泡排序法和插入排序法的比较)