思路:
- 1.从第一个元素开始向后比较相邻元素的大小,如果前一个比后一个大,就交换,直到最后一个元素
- 2.经过1步骤后最大的元素已经在最后一个位置,重复1步骤,但只走到倒数第二个元素(因为倒数第一个已经是最大的了)
- 若有n个元素,重复步骤1 n-1次
初步代码:
public class MyBubbleSort {
public static void main(String[] args) {
int[] arr = {3,2,11,1,2,8,10,20,19,20,4,1,9,8,6,7,7};
bubleSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void bubleSort(int[] arr){
// 走多少趟 例如:有三个元素走两趟就完成排序
for(int i = 0;i < arr.length - 1;i++){
//每一趟交换多少次 :有三个元素:第一趟交换2次,第二趟交换1次
for(int j = 0;j < arr.length - i - 1;j++){
if(arr[j] > arr[j + 1]){
swap(arr,j,j+1);
}
}
}
}
public static void swap(int[] arr,int i,int j){
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
对于{1,2,3,4,5,6,7,8,9}这样的数组以上代码并不友好,我们可以加一个flag,让其等于0,如果一趟比较走完flag的值没有改变,就证明该数组已经有序,直接返回。代码如下:
优化代码:
public static void bubleSort(int[] arr){
// 走多少趟 例如:右三个元素走两趟就完成排序
for(int i = 0;i < arr.length - 1;i++){
//每一趟交换多少次 :第一趟交换2次,第二趟交换1次
int flag = 0;
for(int j = 0;j < arr.length - i - 1;j++){
if(arr[j] > arr[j + 1]){
swap(arr,j,j+1);
flag = 1;//改变flag的值
}
}
if(flag == 0){
return;
}
}
}
算法复杂度分析
js代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var arr = [3,2,11,1,2,8,10,20,19,20,4,1,9,8,6,7,7]
var maopao = function (arr) {
var flag = 0
for (var i = 0; i < arr.length - 1; i++) {
for (var j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
flag = 1
var temp = arr[j]
arr[j] = arr[j + 1]
arr[j + 1] = temp
}
if (flag == 0) {
return arr
}
}
return arr
}
maopao(arr)
console.log(arr)
</script>
</body>
</html>