排序的定义:将数组中的数据按照一定规则顺序排列
冒泡排序:重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
这种方法是最简单的方法,相对的效率就很低;我们从空间复杂度、时间复杂度、稳定性分析
时间复杂度(平均) | 时间复杂度(最好) | 时间复杂度(最坏) | 空间复杂度 | 稳定性 |
稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。
不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。
时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。
空间复杂度:是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。
最简单的冒泡:
每个都遍历:
package cn.swu.stormliu.test; public class bubble { public static void main(String[] args) { int a[]= {5,8,1,6,7,4,7,7,10,55,1,0,3}; for(int i=0;i<a.length;i++) { for(int j=0;j<a.length-1;j++) { if(a[j]>a[j+1]) { int temp=a[j+1]; a[j+1]=a[j]; a[j]=temp; } } } for(int i:a) { System.out.println(i); } } }下一个是将已经排过序的元素不动:
package cn.swu.stormliu.test; public class bubble { public static void main(String[] args) { int a[]= {5,8,1,6,7,4,7,7,10,55,1,0,3}; for(int i=0;i<a.length;i++) { for(int j=0;j<a.length-1-i;j++) { if(a[j]>a[j+1]) { int temp=a[j+1]; a[j+1]=a[j]; a[j]=temp; } } } for(int i:a) { System.out.println(i); } } }这个是设置一个标志位,如果没有发生过元素的换位那么就结束循环,比如我现在数组里面是{8,1,2,3},我现在按照原来的方法,第一趟变成了{1,2,3,8},如果按照原来的方法,那么还是要继续运行程序。可是这个结果已经是我们想要的结果了,这个时候应该退出这个循环方法。所以就变成了
package cn.swu.stormliu.test; public class bubble { public static void main(String[] args) { int a[]= {5,8,1,6,7,4,7,7,10,55,1,0,3}; boolean sorted=true; for(int i=0;i<a.length;i++) { sorted=true; for(int j=0;j<a.length-1-i;j++) { if(a[j]>a[j+1]) { int temp=a[j+1]; a[j+1]=a[j]; a[j]=temp; sorted=false; } } if(sorted) { break; } } for(int i:a) { System.out.println(i); } } }
按照这个方法 上面的{8,1,2,3,}只需要一趟即可完成,简化了步骤