冒泡排序是最简单的排序之一了,其答题思想是通过与相邻元素比较,把较小数往上"浮",较大数往下"沉"的过程,类似于水泡往上升一样,因此得名;冒泡排序几乎是个程序员都写得出来,但是面试的时候如何写一个逼格高的冒泡排序却不是每个人都能做到,下面提供一个参考代码:
import java.util.Comparator;
/**
* 排序器接口
*
*/
public interface Sorter {
/**
* 排序
* @param list 待排序的数组
*/
public <T extends Comparable<T>> void sort(T[] list);
/**
* 排序
* @param list 待排序的数组
* @param comp 比较两个对象的比较器
*/
public <T> void sort(T[] list, Comparator<T> comp);
}
import java.util.Comparator;
public class BubbleSorter implements Sorter {
@Override
public <T extends Comparable<T>> void sort(T[] list) {
boolean swapped = true;
for(int i = 0; i < list.length - 1 && swapped; i++) {
swapped = false;
for(int j = list.length - 1; j > 0; j--) {
if(list[j].compareTo(list[j - 1]) < 0) {
T temp = list[j];
list[j] = list[j - 1];
list[j - 1] = temp;
swapped = true;
}
}
}
}
@Override
public <T> void sort(T[] list, Comparator<T> cmpt) {
boolean swapped = true;
for(int i = 0; i < list.length - 1 && swapped; i++) {
swapped = false;
for(int j = list.length - 1; j > 0; j--) {
if(cmpt.compare(list[j], list[j - 1]) < 0) {
T temp = list[j];
list[j] = list[j - 1];
list[j - 1] = temp;
swapped = true;
}
}
}
}
}
此处swapped的作用是减少比较交换次数, 如2 3 4 5 1这个数组,如果加上swapped,则外层循环只要循环两次就可以了,但不加的话,则要排序N - 1次