1、冒泡排序
public class Bobble {
private static void sort(int[] arrays) {
//一次性读取到高速缓存中,避免cache miss
int length = arrays.length;
for (int i = 1; i < length; i++) {
for (int j = 0; j < length-i ; j++) {
if (!less(arrays[j], arrays[j+1])) {
cmpxchg(arrays, j, j+1);
}
}
}
}
//交换数据
private static void cmpxchg(int[] arrays, int i, int j) {
int array = arrays[i];
arrays[i] = arrays[j];
arrays[j] = array;
}
//i是否小于j
private static boolean less(int i, int j) {
return i < j;
}
//测试
public static void main(String[] args) {
int[] a = {6,5,4,3,2,1};
sort(a);
System.out.println(Arrays.toString(a));
}
}
2、选择排序
public class Select {
private static void cmpxchg(int[] arrays, int i, int j) {
int array = arrays[i];
arrays[i] = arrays[j];
arrays[j] = array;
}
//i是否小于j
private static boolean less(int i, int j) {
return i < j;
}
private static void sort(int[] arrays) {
//每次找出最小值与第一个位置交换
int length = arrays.length;
for (int i = 0; i < length-1 ; i++) {
int minIndex = i;
for (int j = i+1; j < length ; j++) {
//每次比较O(n)
if (!less(arrays[minIndex], arrays[j])) {
minIndex = j;
}
}
//跟当前位置交换
cmpxchg(arrays, minIndex, i);
}
//时间复杂度 O(n) + O(n^2) = O(n^2)
//空间复杂度O(n)
}
public static void main(String[] args) {
int[] a = {6,5,4,3,2,1};
sort(a);
System.out.println(Arrays.toString(a));
}
}
3、插入排序
public class Insert {
private static void cmpxchg(int[] arrays, int i, int j) {
int array = arrays[i];
arrays[i] = arrays[j];
arrays[j] = array;
}
private static boolean less(int i, int j) {
return i < j;
}
private static void sort(int[] arrays) {
int length = arrays.length;
for (int i = 1; i < length ; i++) {
//每次都执行O(n)次for
for (int j = i; j > 0 ; j--) {
//每次都比较O(n)次
if (less(arrays[j-1], arrays[j])) {
break;
}
//每次都交换O(n)次
cmpxchg(arrays, j, j-1);
}
}
//时间复杂度位O(n^2)
}
public static void main(String[] args) {
int[] a = {6,5,4,3,2,1};
sort(a);
System.out.println(Arrays.toString(a));
}
}
4、希维尔排序
public class Shell {
private static void cmpxchg(int[] arrays, int i, int j) {
int array = arrays[i];
arrays[i] = arrays[j];
arrays[j] = array;
}
private static boolean less(int i, int j) {
return i < j;
}
private static void sort(int[] arrays) {
int h = 1;
while (h < arrays.length >> 1)
h = 2 * h + 1;
while (h > 0) {
for (int i = h ; i < arrays.length ; i++) {
for (int j = i; j > h-1 ; j-=h) {
//h==1时就是插入排序
if (less(arrays[j], arrays[j - h])) {
cmpxchg(arrays, j, j - h);
}
}
}
h >>= 1;
}
}
public static void main(String[] args) {
int[] a = {6,5,4,3,2,1};
sort(a);
System.out.println(Arrays.toString(a));
}
}
5、计数排序
public class Count {
private static void cmpxchg(int[] arrays, int i, int j) {
int array = arrays[i];
arrays[i] = arrays[j];
arrays[j] = array;
}
private static boolean less(int i, int j) {
return i < j;
}
private static void sort(int[] arrays) {
//适用于0~9
int length = arrays.length;
int max = arrays[0];
//时间复杂度 O(n)
for (int i = 1; i < length ; i++) {
if (less(max, arrays[i])) {
max = arrays[i];
}
}
//时间复杂度 O(n)
int[] tempArrays = new int[max+1];
for (int i = 0; i < length ; i++) {
tempArrays[arrays[i]]++;
}
int index = 0;
//时间复杂度 O(n)
for (int i = 0; i < tempArrays.length ; i++) {
if (tempArrays[i]-- > 0) {
arrays[index++] = i;
}
}
//总时间复杂度 O(n) + O(n) + O(n) = 3O(n) = O(n)
}
public static void main(String[] args) {
int[] a = {6,5,4,3,2,1};
sort(a);
System.out.println(Arrays.toString(a));
}
}
6、基数排序
public class Buckets {
private static void cmpxchg(int[] arrays, int i, int j) {
int array = arrays[i];
arrays[i] = arrays[j];
arrays[j] = array;
}
private static boolean less(int i, int j) {
return i < j;
}
private static void sort(int[] arrays) {
int length = arrays.length;
List<List<Integer>> temp = new ArrayList(10);
for (int i = 0; i < 10 ; i++) {
temp.add(new ArrayList<>());
}
//要找出最大值
int max = arrays[0];
//时间复杂度 O(n)
for (int i = 1; i < length ; i++) {
if (less(max, arrays[i])) {
max = arrays[i];
}
}
//
int len = String.valueOf(max).length();
//取余,取整
int balance = 10, adjustment = 1;
while (len > 0) {
for (int i = 0; i < length ; i++) {
int index = arrays[i] % balance / adjustment;
temp.get(index).add(arrays[i]);
}
//第一轮完毕,取出数据
int index = 0;
for (List<Integer> list : temp) {
if (list != null) {
for (int i = 0; i < list.size(); i++) {
arrays[index++] = list.remove(i--);
}
}
}
//
balance*=10;
adjustment*=10;
len--;
}
}
public static void main(String[] args) {
int[] a = {61,55,43,38,25,14};
sort(a);
System.out.println(Arrays.toString(a));
}
}
7、归并排序
public class Merge {
private static int[] temp = new int[6];
private static void cmpxchg(int[] arrays, int i, int j) {
int array = arrays[i];
arrays[i] = arrays[j];
arrays[j] = array;
}
private static boolean less(int i, int j) {
return i < j;
}
private static void sort(int[] arrays) {
//每次找出最小值与第一个位置交换
sort(arrays, 0, arrays.length-1);
}
private static void sort(int[] arrays, int i, int j) {
if (j <= i) {
return;
}
int start = i;
int end = j;
int tempMid = start + ((end-start) >> 1);
sort(arrays, start, tempMid);
sort(arrays, tempMid + 1, end);
merge(arrays, start, end, tempMid);
}
private static void merge(int[] arrays, int i, int j, int mid) {
//这里不能从0开始
int index = i;
int left = i, right = mid + 1;
for (; left < right && right <= j; ) {
if(less(arrays[left], arrays[right])) {
temp[index++] = arrays[left++];
} else {
temp[index++] = arrays[right++];
}
}
//判断左边是否已经遍历完毕
while (left <= mid) {
temp[index++] = arrays[left++];
}
//判断右边是否已经遍历完毕
while (right <= j) {
temp[index++] = arrays[right++];
}
for (int k = i; k <= j ; k++) {
arrays[k] = temp[k];
}
}
public static void main(String[] args) {
int[] a = {6,5,4,3,2,1};
sort(a);
System.out.println(Arrays.toString(a));
}
}
8、堆排序
public class Head {
private static void cmpxchg(int[] arrays, int i, int j) {
int array = arrays[i];
arrays[i] = arrays[j];
arrays[j] = array;
}
private static boolean less(int i, int j) {
return i < j;
}
private static void sort(int[] arrays) {
buildMaxHead(arrays);
int length = arrays.length;
for (int i = length - 1 ; i > 0 ; ) {
//每次都与最后一个交换
cmpxchg(arrays, 0, i);
i--;
//开始下沉
int k = 0;
while (k <= i) {
int left = (k << 1) + 1;
if (left > i) {
break;
}
int value = arrays[left];
int right = left + 1;
if (right <= i && less(value, arrays[right])) {
value = arrays[left = right];
}
if (less(arrays[k], value)) {
cmpxchg(arrays, k, left);
}
k = left;
}
}
}
private static void buildMaxHead(int[] arrays) {
int length = (arrays.length - 1) >>> 1;
for (int i = length; i >= 0; i--) {
int k = i;
while (k <= length) {
int left = (k << 1) + 1;
int value = arrays[left];
int right = left + 1;
if (right < arrays.length && less(value, arrays[right])) {
value = arrays[left=right];
}
if (less(arrays[k], value)) {
cmpxchg(arrays, k, left);
}
k = left;
}
}
}
public static void main(String[] args) {
int[] a = {8,7,6,5,4,3,2,1};
sort(a);
System.out.println(Arrays.toString(a));
}
}
9、快速排序
public class Quick {
private static void cmpxchg(int[] arrays, int i, int j) {
int array = arrays[i];
arrays[i] = arrays[j];
arrays[j] = array;
}
private static boolean less(int i, int j) {
return i < j;
}
private static void sort(int[] arrays) {
//每次找出最小值与第一个位置交换
sort(arrays, 0, arrays.length-1);
}
private static void sort(int[] arrays, int low, int high) {
if (low >= high) {
return;
}
int position = position(arrays, low, high);
sort(arrays, low, position-1);
sort(arrays, position+1, high);
}
private static int position(int[] arrays, int low, int high) {
int left = low, right = high + 1;
int comparable = arrays[low];
while (true) {
while (less(comparable, arrays[--right])) {
if (low == right) {
break;
}
}
//从左往右扫描
while (!less(comparable, arrays[++left])) {
if (left == right) {
break;
}
}
if (left >= right) {
cmpxchg(arrays, low, right);
break;
} else {
cmpxchg(arrays, left, right);
}
}
return right;
}
public static void main(String[] args) {
int[] a = {6,5,4,3,2,1};
sort(a);
System.out.println(Arrays.toString(a));
}
}