排序算法之--冒泡排序(和优化)
冒泡排序其实就是做沉底运动,两两比较,谁大谁沉底。
举例说明:要排序数组:int[] arr={6,3,8,2,9,1};
第一趟排序:
第一次排序:6和3比较,6大于3,交换位置: 3 6 8 2 9 1
第二次排序:6和8比较,6小于8,不交换位置:3 6 8 2 9 1
第三次排序:8和2比较,8大于2,交换位置: 3 6 2 8 9 1
第四次排序:8和9比较,8小于9,不交换位置:3 6 2 8 9 1
第五次排序:9和1比较:9大于1,交换位置: 3 6 2 8 1 9
第一趟总共进行了5次比较, 排序结果: 3 6 2 8 1 9
---------------------------------------------------------------------
第二趟排序:
第一次排序:3和6比较,3小于6,不交换位置:3 6 2 8 1 9
第二次排序:6和2比较,6大于2,交换位置: 3 2 6 8 1 9
第三次排序:6和8比较,6大于8,不交换位置:3 2 6 8 1 9
第四次排序:8和1比较,8大于1,交换位置: 3 2 6 1 8 9
第二趟总共进行了4次比较, 排序结果: 3 2 6 1 8 9
---------------------------------------------------------------------
第三趟排序:
第一次排序:3和2比较,3大于2,交换位置: 2 3 6 1 8 9
第二次排序:3和6比较,3小于6,不交换位置:2 3 6 1 8 9
第三次排序:6和1比较,6大于1,交换位置: 2 3 1 6 8 9
第二趟总共进行了3次比较, 排序结果: 2 3 1 6 8 9
---------------------------------------------------------------------
第四趟排序:
第一次排序:2和3比较,2小于3,不交换位置:2 3 1 6 8 9
第二次排序:3和1比较,3大于1,交换位置: 2 1 3 6 8 9
第二趟总共进行了2次比较, 排序结果: 2 1 3 6 8 9
---------------------------------------------------------------------
第五趟排序:
第一次排序:2和1比较,2大于1,交换位置: 1 2 3 6 8 9
第二趟总共进行了1次比较, 排序结果: 1 2 3 6 8 9
---------------------------------------------------------------------
最终结果:1 2 3 6 8 9
---------------------------------------------------------------------
由此可见:N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次,所以可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数,即
for(int i=0;i<arr.length-1;i++) { for(int j=0;j<arr.length-1-i;j++) { //交换位置 } }
冒泡排序法 口诀:
外层循环 0到n-1 //控制比较轮数 n 表示元素的个数
内层循环 0到n-i-1 //控制每一轮比较次数
两两比较做交换
代码实现:
public static void main(String[] args) { int [] arr=new int[]{ 1 , 9, 2 ,8, 3 , 7 ,5 ,4}; for(int mydata:arr) { System.out.print(mydata+" "); } System.out.print("\n"); for(int i=0;i<arr.length-1;i++) { for(int j=i;j<arr.length-1-i;j++) { if(arr[j]>arr[j+1]) { int temp =arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } for(int mydata:arr) { System.out.print(mydata+" "); } System.out.print("\n"); } }
每次最大的数沉底
但是最后几个数据重复做比较了,优化一下算法,加个标识符,每交换一下记录一下
public static void main(String[] args) { int [] arr=new int[]{ 1 , 9, 2 ,8, 3 , 7 ,5 ,4}; for(int mydata:arr) { System.out.print(mydata+" "); } System.out.print("\n"); boolean flag=false; for(int i=0;i<arr.length-1;i++) { for(int j=0;j<arr.length-1-i;j++) { if(arr[j]>arr[j+1]) { int temp =arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; flag=true; } } if(!flag) { break; } else { flag=false; } for(int mydata:arr) { System.out.print(mydata+" "); } System.out.print("\n"); } }
最基础的冒泡排序。
参考 https://www.cnblogs.com/shen-hua/p/5422676.html