【java】冒泡算法及冒泡算法优化
初始写法
public static void bubbleSort(int[] arr){
for(int i = 0; i < arr.length-1; i++){
for(int j = 0; j < arr.length-1; j++){
if(arr[j]>arr[j+1]){
//如果左边元素大于右边元素,二者交换,保证右边元素永远大于左边元素。
swap(arr,j,j+1);
}
}
}
}
private static void swap(int[] arr ,int i ,int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
第一次优化
优化方向:减少排序次数。
首先我们要搞清楚,什么情况下算是两个数字进行了排序?
即每当两数进行交换时,则代表两数进行了排序。
因此我们可以通过两数是否交换来判断,两数是否为乱序,是否需要排序。
这样即可减少排序的次数。
//引入布尔类型变量来判断是否交换过。
public static bubbleSort(int[] arr){
//默认交换过
boolean swapped = true;
for(int i = 0; i < arr.length; i++){
//若未发生交换,则说明有序,无需排序。
if(!swapped){
break;
}
swapped = false;
for(int j = 0; j < arr.length-1; j++){
if(ar[j] > arr[j+1]){
swap(arr,j,j+1);
swapped = true;
}
}
}
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
第二次优化
在第一次优化的基础之上,减少排序次数,可以视为缩小排序范围。
public static void bubbleSor(int[] arr){
boolean swapped = true;
//设定范围,最后一个没有被排序的元素的小标
int index = arr.length-1;
//上次发生交换的元素的位置,初始默认为-1
int swappedindex = -1;
while(swapped){
swapped = false;
for(int i = 0; i < index; i++){
if(arr[i] > arr[i+1]){
swap(arr,i,i+1);
swapped = true;
swappedindex = i;
}
}
index = swappedindex;
}
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}