1、冒泡排序
冒泡排序(Bubble Sort),它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序错误就把他们交换过来。冒泡排序的时间复杂度平均情况下为O(n*2)。
/**
* 冒泡排序
* @author Victor Gong
*
*/
public class BubbleSort {
public void sort(int[] a) {
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a.length - 1; j++) {
if (less(a, j + 1, j)) {
exch(a, j + 1, j);
}
}
}
assert isSorted(a);
}
/**
*
* @param a 数组
* @param i 索引i
* @param j 索引j
* @return a[i]是否比a[j]小
*/
private boolean less(int[] a, int i, int j) {
return a[i] < a[j];
}
/**
* 交换位置
* @param a
* @param i
* @param j
*/
private void exch(int[] a, int i, int j) {
int t = a[i];
a[i] = a[j];
a[j] = t;
}
/**
*
* @param a
* @return 数组是否完成排序
*/
private boolean isSorted(int[] a) {
for (int i = 1; i < a.length; i++) {
if (less(a, i, i - 1)) {
return false;
}
}
return true;
}
}
2、改进版冒泡排序
改进版冒泡排序的方法为在冒泡排序的基础上加上一个判断是否已经排序完成的变量,如果该数组在对比元素大小的过程中没有发生一次交换,则说明该数组已经完成排序,只需要退出循环即可。该算法的时间复杂度最好的情况下为O(n),最坏的情况下为O(n2),平均情况下为O(n2)。
/**
* 改良版的冒泡排序
* @author Victor Gong
*
*/
public class EnhancedBubbleSort {
public void sort(int[] a) {
boolean flag = false;
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a.length - 1; j++) {
if (less(a, j + 1, j)) {
flag = true;
exch(a, j + 1, j);
}
}
if (flag == false) {
break;
}
flag = false;
}