简单排序算法时间空间复杂度分析及应用(1)-冒泡排序
冒泡排序算法,我上大学一开始接触的算法就是冒泡排序算法,这是算法入门知识,通过冒泡排序算法我接触了循环的概念,循环有开始节点和结束节点,并且算法会经历所有的中间节点(包括始节点和终节点),走过节点的顺序方向从始节点到终节点,算法会比较节点前后的节点,然后根据节点的值大小和排序顺序来决定这个节点前后节点是否交换,当循环终结后,就能得到排序想要的结果。
冒泡算法其实在军训站立的时候由高到低排列得到了使用。高的往最右边靠,虽然只有移动动作,但是比较过程已经在我们自己的脑内发生了。
冒泡排序其实是有两个循环嵌套在一起,外循环始点是其中一个端节点,终点是另外一个端节点,所有已经经历的节点都是最后已经确定排序位置的节点数据,内循环的方向是和外循环方向相反的,内循环的始点是外循环的终点,内循环的终点是外循环的正在经历的中间节点。循环图:
循环中会比较此节点和下一个节点,如果满足交换条件就交换两个节点的值,不满足就不交换。交换节点值会消耗时间,而空间只需要一个节点空间就行。因此时间复杂度对于冒泡排序是该算法的效率判断因素。时间复杂度最低为所有的节点都不会交换值,最高为所有的节点都会交换值。所有节点都不交换值的情况是:增序排序且数据都是增序;降序排序且数据都是降序。相反,所有节点都交换值的情况是:增序排序且数据都是降序;降序排序且数据都是增序。前者时间复杂度为O(0),后者时间复杂度为O(n的平方)。
冒泡排序java环境实现:
/*
* 冒泡排序
* bubble sort
* 冒泡排序算法 时间复杂度O(n平方),最好的时间复杂度O(n)
* bubble sort 排序中有元素比较,元素移动两种类型动作。
* 其中元素比较的次数是固定的:n(n-1)/2次;元素移动次数最少0次,最多(n-1)n/2次
* @param sortOrder 为true是增序,为false时降序
*/
public static void bubbleSort(boolean sortOrder){
int z , max , min;
for(int m = array.length - 1 ; m > 0 ; -- m)
for(int n = 0 ; n < m ; ++ n)
{
max = array[n] >= array[n+1] ? array[n]:array[n+1];
min = array[n] < array[n+1] ? array[n]:array[n+1];
if((sortOrder&&min == array[n+1])||(!sortOrder && max == array[n+1]))
{
z = array[n+1];
array[n+1] = array[n];
array[n] = z;
}
}
}
冒泡排序结构图:
在之后的基本排序算法中的分析及应用文章中我都会使用下面几个概念:
1.内外循环,循环起点,循环终点,循环方向,确定区域,待确定区域,确定节点,待确定节点。下一章将涉及其他概念。
确定区域:已经排序的数组部分数据范围。
待确定区域:和确定区域相反,是还未排好序的数组部分数据范围
确定节点:所有确定节点集合为确定区域
待确定节点:集合为待确定区域
循环节点:循环正在循环的节点。