8.3.1_冒泡排序
知识总览:
冒泡排序:
概念:
从后往前(或从前往后)两两比较相邻元素的值,若为逆序(A[i-1]>A[i]),则交换它们,直到序列比较完,称这样过程为一趟冒泡排序......抄的视频上讲解
从后往前冒泡(每次都排序值最小的元素)算法实现:
交换2个值a、b:添加一个中间变量temp,先把a的值给temp,再把b的值给a,再把temp的值给b,交换成功,形成一个环
变量i:i所指位置之前的元素是已经排好序的不用再交换的,每交换一趟i+1,因为双层for循环中有j>i即不会再交换i位置之前的元素位置
变量j:j=元素个数-1即数组中的最后一个元素位置,数组倒序交换排序
变量j-1:即数组中的最后一个元素位置,用来比较index=j和index=j-1位置上的元素的值大小,如果[j-1] >A[j]交换位置,如果A[j-1] =A[j]不改变位置用来保持算法的稳定性,如果A[j-1]<A[j]位置不变
flag变量:用来记录本趟排序是否有交换动作发生,如果没有证明顺序已经排好,结束排序
算法性能分析:
空间复杂度O(1):因为只需定义几个辅助变量使用常数级的空间就可以实现算法(视频上这么说的)
最好情况(有序):只需进行1趟冒泡,有n个元素需要比较n-1次(两两比较),交换0次,时间复杂度O(n)
最坏情况(逆序):第1趟冒泡,有n个元素需要比较n-1次(两两比较),交换n-1次
第2趟冒泡,有n个元素需要比较n-2次(两两比较,但是因为第一个元素已经排好序了,不用再比较了),交换n-2次
第3趟冒泡,有n个元素需要比较n-3次(两两比较,但是因为前2个元素已经排好序了,不用再比较了,即只需两两比较n-2个元素,需要比较n-3次),交换n-3次
。。。。。。。
所有趟的交换次数总和为n(n-1)/2=比较次数即最坏时间复杂度O(n²)
冒泡排序平均时间复杂度为O(n²)
注意:每交换一次,元素要移动3次,如下图a和b的交换,a要移到temp,b要移到a,temp要移到b,在最坏的情况下,交换次数==比较次数!=元素移动次数
冒泡排序是稳定的
冒泡排序是否用于链表:
可以。从链头元素开始,如果链头元素比后边元素大,就链头元素和后边元素交换,如果不大不动,
从前往后冒泡(每次都排序值最大的元素):
即第一趟先把大的元素放在最后,第2趟放第2大的元素。。。。。。
知识回顾:
。。。。。。。。。。。。
水水水水水水