赞
踩
相信大家在学习数据结构算法的时候经常会遇到的问题就是,老师讲解完这个算法思想,自己也听懂了,但一到自己写代码就写不出来,或者是即便自己模模糊糊的照着网上的代码自己写出来了,但是过几天就又忘了,其实这就是我们没有深刻的理解的这个算法的思想。
接下来,我就结合图例给大家详细的讲解一下。
冒泡排序的名字是因为元素排序的过程像水中的气泡一样一个一个的浮出水面,元素也一个一个从大到小(从小到大)的排序完成。
1、两两相邻的元素进行比较,如果前面元素大于后面元素就交换两个元素的位置,最终的结果是最大的一个元素移动到了最后的位置。 我们暂称这个过程为冒泡。
2、如果有n个元素那么【冒泡操作】重复n-1次即可排序完成。
我们来看一个动图来体会一下冒泡排序算法。
我们有一个待排序序列是:【3,44,38,5,47,15,36】
如果要将这7个元素进行排序那么需要进行6趟冒泡才能完成排序。
第一趟冒泡:
①第一个元素和第二个元素进行比较,第一个小于第二个位置不变。
②第二个元素和第三个元素比较,前面元素44大于后面元素38,所以交换两元素的位置。
③交换完成后,继续比较第三个和第四个元素的大小,前面元素44大于后面元素5,所以交换两元素的位置。
③交换完成后,继续比较第四个和第五个元素的大小,前面元素44小于后面元素47,所以两元素的位置不变。
`
④继续比较第五个和第六个元素的大小,前面元素47大于后面元素15,所以交换两元素的位置。
⑤交换完成后,继续比较第三个和第四个元素的大小,前面元素47大于后面元素36,所以交换两元素的位置。
第一趟冒泡总结: 经过第一趟的冒泡,成功将这个序列中最大的元素47移动到了最后面,那么我们在重复执行5次这个冒泡的过程,即可将所有元素从大到小排序完成了。外层for循环控制循环的趟数。
O(n2)
空间复杂度由于需要开辟一个临时空间所以是:O(1)
#include<stdio.h> void Print(int array[],int len){ for(int i=0;i<len;i++){ printf("%d ",array[i]); } } void BubbleSort(int array[],int len){ int tem; //外层循环控制 排序的趟数 n个元素排序需要循环n-1次 【1】 for(int i=0;i<len-1;i++) { //内层循环控制比较的次数 n个元素第i趟比较n-i次 【2】 for(int j=0;j<len-1-i;j++) { //比较相邻的元素大小 目的:将最大的元素选出到移动到最后 if(array[j]>array[j+1]){ tem = array[j]; array[j] = array[j+1]; array[j+1] = tem; } } } printf("\n\n排序完成!\n"); } int main(){ int array[] = {3,44,38,5,47,15,36}; int len = sizeof(array) / sizeof(int); printf("原始序列为:\n"); Print(array,len); BubbleSort(array,len); printf("\n排序后序列为:\n"); Print(array,len); }
当我在学习完这个冒泡排序算法的时候尝试自己写代码,但是有两个地方我觉得容易出现问题所有在这里说明一下:
【1】第一个for循环是控制进行几次冒泡的,所以循环的次数的是待排序序列元素个数减一次。
【2】第二个for循环是控制每一趟冒泡两两元素间进行比较的,j从0到n-1,j+1从1到n这个地方我第一次 忽略-1,即j从0到n,那么j+1就会超过了排序序列的最大长度。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。