Java排序算法之冒泡排序
写在前面的话:这段时间在学习排序算法,想把学习的内容总结一下。从最简单的排序算法开始吧。
Java算法之冒泡排序
基本过程:对于一个要排序的数列,我们从复遍历这个数列,一次比较两个数,如果他们顺序错误,我们就交换他们位置。遍历工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
Java代码实现:
public class Maopao { public static void main(String[] args) { int [] s = {8,3,2,1,7,4,6,5}; int temp = 0; for(int i=0;i<s.length-1;i++){ for(int j=0;j<s.length-1-i;j++){ if(s[j]>s[j+1]){ temp=s[j]; s[j]=s[j+1]; s[j+1]=temp; } } } for(int value:s) System.out.print(value); } }
代码优化:上面代码会出现多余的比较,因为排序可能已经完成,但循环还没有结束,这样就会进行多余的比较。
public class Maopao { public static void main(String[] args) { int [] s = {8,3,2,1,7,4,6,5}; int temp = 0; for(int i=0;i<s.length-1;i++){ boolean flag = false;//每次重置标记为false for(int j=0;j<s.length-1-i;j++){ if(s[j]>s[j+1]){ temp=s[j]; s[j]=s[j+1]; s[j+1]=temp; flag=true; } } if(!flag) break;//如果没有交换跳出循环 } for(int value:s) System.out.print(value); } }
在分析算法性能之前先了解一些概念:
时间复杂度:需要排序的的关键字的比较次数和相应的移动的次数。
空间复杂度:分析需要多少辅助的内存。
稳定性:如果记录两个关键字的A和B它们的值相等,经过排序后它们的位置没有发生交换,那么我们称这个排序算法是稳定的。否则我们称这个排序算法是不稳定的。
算法性能分析:
时间复杂度:若原始序列为"正序",则比较次数为n-1次,无需交换。若原始序列为逆序则比较次数和交换次数都为n(n-1)/2;因此冒泡排序总的时间复杂度为O(n*n)。
空间复杂度:冒泡排序空间复杂度很好,它只需要一个附加单元用于数据交换,所以其空间复杂度为O(1)。
稳定性:冒泡排序是基于相邻元素的比较,若两个元素相等,按照冒泡排序的思想是不会进行交换的。所以排序后位置不会发生改变。算法是稳定的。