这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名。
算法原理
前一个元素比后一个元素大,就交换他们的位置,大的元素排后面,升序,前一个元素比后一个元素小,就叫唤他们位置,小的排后面,这就是降序。
算法分析:例如int[] arr={9,8,7,6,5}让按升序排列
第一趟第一次 {8,9,7,6,5} 9与8交换
第一趟第二次{8,7,9,6,5} 9与7交换
第一趟第三次{8,7,6,9,5}9与6交换
第一趟第四次{8,7,6,5,9}9与5交换
第二趟第一次{7,8,6,5,9}8月7交换
第二趟第二次{7,6,8,5,9}8与6交换
第二趟第三次{7,6,5,8,9}8与5交换
第三趟第一次{6,7,5,8,9}7与6交换
第三趟第二次{6,5,7,8,9}7与5交换
第四趟第一次{5,6,7,8,9}5与6交换
没交换一趟就少遍历一次
5个数,交换4趟
for(int i=0 ; i < arr.leng -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;
}
}
}
这种方式是遍历最多次数的,有些还可以简化下的,例如:
int arr[]={7,4,5,6,8};
第一趟第一次{4,7,5,6,8} 7与4交换
第一趟第二次{4,5,7,6,8}7月5交换
第一趟第三次{4,5,6,7,8}7月6交换
第一趟第四次{4,5,6,7,8}不用交换
第二趟不用交换了,前面已经排过序了
boolean flag=true;
for(int i = 0 ; i < arr.length -1 ; i ++) {
for(int j=0;j<arr.length-1-i&&flag;j++){
flag=false;
if(arr[j]>arr[j+1]){
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
flag=true;
}
}
}
如果后面有一趟没发生交换,那么循环就结束。