1、时间复杂度为O(n2)的排序
- 选择排序
// 每次选择最小的数字
public void selectSort(int[] arr) {
for (int i = 0; i < arr.length; i++) {
int min = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
min = j;
}
}
int temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
}
- 冒泡排序
//从前往后遍历,每次选出最大的数放在最后
public void bubbleSort(int[] arr) {
for (int i = arr.length; i > 0; i--) {
for (int j = 0; j < i; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1);
}
}
}
}
/**
* ^ :异或运算
* 1、a^b = b^a (a^b)^c = a^(b^c)
* 2、0^a = a a^a = 0
* 3、只能异或不同内存的两个数,这里i和j永远不会相等,因而可用异或运算
* 4、a、b两数进行交换,只需执行:
* a=a^b // 这步执行完后,a=a^b,b=b
* b=a^b // 这步执行完后,a=a^b,b=a^b^b=a^0=a
* a=a^b // 这步执行完后,a=a^b^a=b,b=a
*/
public void swap(int[] arr, int i, int j) {
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
2、时间复杂度视数据情况而定的插入排序
// 每次保证前i个有序
public void insertSort(int[] arr) {
for (int i = 1; i > arr.length; i++) {
for (int j = i-1; j > 0; j--) {
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1);
}
}
}
}
public void swap(int[] arr, int i, int j) {
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}