冒泡排序及优化
首先看一般的冒泡排序算法:
public static void sort(int[] arr){
for(int i = arr.length;i > 0; i--){
for(int j = 1;j < i;j++){
if(arr[j] < arr[j-1])swap(arr, j, j-1);
}
}
}
优化冒泡排序主要有两种方式。
一是从外层循环优化:增加一个标记flag
,如果某一趟排序的过程中未发现内层循环执行过位置的交换,则说明待排序的无序区中所有的元素均满足有序
,因此冒泡排序可以在此时终止。
public static void sort(int[] arr){
boolean flag = false;
for(int i = arr.length;i > 0; i--){
for(int j = 1;j < i;j++){
if(arr[j] < arr[j-1]){
swap(arr, j, j-1);
flag = true;
}
}
if(!flag)break;
}
}
二是从内存循环优化:记录下最后一次交换位置。在每一趟扫描中,记录下最后一次交换的位置last
,这样在下一次扫描时arr[last....end]
都是有序区,arr[1....last-1]
都是无序区,从而减少不必要的遍历。
public static void sort(int[] arr){
boolean flag = false;
int last = 0, k = arr.length-1;
for(int i = arr.length;i > 0; i--){
flag = false;
for(int j = 0;j < k;j++){
if(arr[j] > arr[j+1]){
swap(arr, j, j+1);
last = j;
flag = true;
}
}
k = last;
if(!flag)break;
}
}