- 时间复杂度顺序:O(1) < O(log2n) < O(n) < O(nlog2n) < O(n2) < O(n3) < O(nk) < O(2n)
排序
排序算法 | 平均时间复杂度 | 最好情况 | 最坏情况 | 空间复杂度 | 稳定性 |
---|---|---|---|---|---|
冒泡排序 | O(n2) | O(n) | O(n2) | O(1) | 稳定 |
选择排序 | O(n2) | O(n2) | O(n2) | O(1) | 不稳定 |
插入排序 | O(n2) | O(n) | O(n2) | O(1) | 稳定 |
希尔排序 | O(nlog2n) | O(n1.3) | O(n2) | O(1) | 不稳定 |
归并排序 | O(nlog2n) | O(nlog2n) | O(nlog2n) | O(n) | 稳定 |
快速排序 | O(nlog2n) | O(nlog2n) | O(n2) | O(log2n) | 不稳定 |
堆排序 | O(nlog2n) | O(nlog2n) | O(nlog2n) | O(1) | 不稳定 |
基数排序 | O(n*k) | O(n*k) | O(n*k) | O(n+k) | 稳定 |
冒泡排序
public class Bubble {
public static void main(String[] args) {
int[] ints = new int[100000];
for (int i = 0; i < ints.length; i++) {
ints[i] = (int) (Math.random() * 100000000);
}
long start = System.currentTimeMillis();
for (int i = 0; i < ints.length - 1; i++) {
boolean flag = false;
for (int j = 0; j < ints.length - 1 - i; j++) {
if (ints[j + 1] > ints[j]) {
flag = true;
int temp = ints[j + 1];
ints[j + 1] = ints[j];
ints[j] = temp;
}
}
if (!flag) {
break;
}
}
long end = System.currentTimeMillis();
System.out.println(end - start);
}
}
选择排序
public class Select {
public static void main(String[] args) {
int[] ints = new int[100000];
for (int i = 0; i < ints.length; i++) {
ints[i] = (int) (Math.random() * 100000000);
}
long start = System.currentTimeMillis();
for (int i = 0; i < ints.length - 1; i++) {
int min = ints[i];
int pos = i;
for (int j = i + 1; j < ints.length; j++) {
if (ints[j] < min) {
min = ints[j];
pos = j;
}
}
int temp = ints[pos];
ints[pos] = ints[i];
ints[i] = temp;
}
long end = System.currentTimeMillis();
System.out.println(end - start);
}
}
插入排序
public class Insert {
public static void main(String[] args) {
int[] ints = new int[100000];
for (int i = 0; i < ints.length; i++) {
ints[i] = (int) (Math.random() * 100000000);
}
long start = System.currentTimeMillis();
for (int i = 1; i < ints.length; i++) {
int value = ints[i];
int index = i - 1;
while (index >= 0 && value < ints[index]) {
ints[index + 1] = ints[index];
index--;
}
ints[index + 1] = value;
}
long end = System.currentTimeMillis();
System.out.println(end - start);
}
}
希尔排序
交换法
public class Shell01 {
public static void main(String[] args) {
int[] ints = new int[100000];
for (int i = 0; i < ints.length; i++) {
ints[i] = (int) (Math.random() * 100000000);
}
long start = System.currentTimeMillis();
for (int step = ints.length / 2; step > 0; step /= 2) {
for (int j = step; j < ints.length; j++) {
for (int k = j - step; k >= 0; k -= step) {
if (ints[k] > ints[k + step]) {
int temp = ints[k];
ints[k] = ints[k + step];
ints[k + step] = temp;
}
}
}
}
long end = System.currentTimeMillis();
System.out.println(end - start);
}
}
移位法
public class Shell02 {
public static void main(String[] args) {
int[] ints = new int[100000];
for (int i = 0; i < ints.length; i++) {
ints[i] = (int) (Math.random() * 100000000);
}
long start = System.currentTimeMillis();
for (int step = ints.length / 2; step > 0; step /= 2) {
for (int i = step; i < ints.length; i++) {
int pos = i;
int value = ints[i];
while (pos - step >= 0 && value < ints[pos - step]) {
ints[pos] = ints[pos - step];
pos -= step;
}
ints[pos] = value;
}
}
long end = System.currentTimeMillis();
System.out.println(end - start);
}
}
快速排序
public class Quick {
public static void main(String[] args) {
int[] ints = new int[100000];
for (int i = 0; i < ints.length; i++) {
ints[i] = (int) (Math.random() * 100000000);
}
long start = System.currentTimeMillis();
quick(0, ints.length - 1, ints);
long end = System.currentTimeMillis();
System.out.println(end - start);
}
public static void quick(int left, int right, int[] ints) {
if (left > right) {
return;
}
int l = left;
int r = right;
int pivot = ints[left];
while (l < r) {
while (pivot <= ints[r] && l < r) {
r--;
}
while (pivot >= ints[l] && l < r) {
l++;
}
if (l < r) {
int temp = ints[l];
ints[l] = ints[r];
ints[r] = temp;
}
}
ints[left] = ints[l];
ints[l] = pivot;
quick(left, r - 1, ints);
quick(r + 1, right, ints);
}
}
基数排序
public class Radix {
public static void main(String[] args) {
List<Queue<Integer>> list = new ArrayList<>(10);
for (int i = 10; i > 0; i--) {
list.add(new LinkedList<>());
}
int[] ints = new int[100000];
for (int i = 0; i < ints.length; i++) {
ints[i] = (int) (Math.random() * 100000000);
}
int max = ints[0];
for (int anInt : ints) {
if (anInt > max) {
max = anInt;
}
}
long start = System.currentTimeMillis();
int maxLength = (max + "").length();
for (int i = 0, n = 1; i <= maxLength; i++, n *= 10) {
for (int anInt : ints) {
int element = (anInt / n) % 10;
list.get(element).add(anInt);
}
int index = 0;
for (Queue<Integer> queue : list) {
while (!queue.isEmpty()) {
ints[index] = queue.poll();
index++;
}
}
}
long end = System.currentTimeMillis();
System.out.println(end - start);
}
}
查找
折半查找
public class Binary {
public static void main(String[] args) {
int[] ints = {1,5,96,478,569,789,1234,4896,5896,6781,6781,6781,6781,8985};
System.out.println(search(ints, 6781, 0, ints.length - 1));
}
public static List<Integer> search(int[] ints, int value, int low, int high) {
List<Integer> list = new ArrayList<>();
while (low <= high) {
int mid = (low + high) / 2;
int temp = ints[mid];
if (value < temp) {
high = mid - 1;
} else if (value > temp) {
low = mid + 1;
} else {
list.add(mid);
int left = mid - 1;
while (left >= 0 && ints[left] == value) {
list.add(left);
left--;
}
int right = mid + 1;
while (right <= ints.length - 1 && ints[right] == value) {
list.add(right);
right++;
}
break;
}
}
return list;
}
}
插值查找
//关键字分布均匀,速度较快
public class Insert {
public static void main(String[] args) {
int[] ints = {1,5,96,478,569,789,1234,4896,5896,6781,6781,6781,6781,8985};
System.out.println(search(ints, 6781, 0, ints.length - 1));
}
public static List<Integer> search(int[] ints, int value, int low, int high) {
if (low > high || value < ints[0] || value > ints[ints.length - 1]) {
return null;
}
int mid = low + (high - low) * (value - ints[low]) / (ints[high] - ints[low]);
int temp = ints[mid];
if (value < temp) {
return search(ints, value, low, mid - 1);
} else if (value > temp) {
return search(ints, value, mid + 1, high);
} else {
List<Integer> list = new ArrayList<>();
list.add(mid);
int left = mid - 1;
while (left >= 0 && ints[left] == value) {
list.add(left);
left--;
}
int right = mid + 1;
while (right <= ints.length - 1 && ints[right] == value) {
list.add(right);
right++;
}
return list;
}
}
}
斐波那契查找
public class Fibonacci {
public static void main(String[] args) {
int[] ints = {1,5,96,478,569,789,1234,4896,5896,6781,6781,6781,6781,8985,8985};
System.out.println(search(ints, 8985));
}
public static int[] fib() {
int[] f = new int[20];
f[0] = 1;
f[1] = 1;
for (int i = 2; i < 20; i++) {
f[i] = f[i - 1] + f[i - 2];
}
return f;
}
public static List<Integer> search(int[] ints, int value) {
List<Integer> list = new ArrayList<>();
int low = 0;
int high = ints.length - 1;
int k =0;
int mid = 0;
int[] f = fib();
while (high > f[k] - 1) {
k++;
}
int[] temp = Arrays.copyOf(ints, f[k]);
for (int i = high + 1; i < temp.length; i++) {
temp[i] = ints[high];
}
while (low <= high) {
mid = low + f[k - 1] - 1;
if (value < temp[mid]) {
high = mid - 1;
k--;
} else if (value > temp[mid]) {
low = mid + 1;
k -= 2;
} else {
if (mid <= high) {
list.add(mid);
int left = mid - 1;
while (left >= 0 && ints[left] == value) {
list.add(left);
left--;
}
int right = mid + 1;
while (right <= high && ints[right] == value) {
list.add(right);
right++;
}
} else {
list.add(high);
int left = high - 1;
while (left >= 0 && ints[left] == value) {
list.add(left);
left--;
}
}
break;
}
}
return list;
}
}
哈希表
public class User {
private int id;
private String name;
public User() {
}
public User(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
public class HashTab {
private List<List<User>> list;
private int size;
public HashTab(int size) {
this.size = size;
list = new ArrayList<>(size);
for (int i = 0; i < size; i++) {
list.add(new ArrayList<>());
}
}
public int hashFun(int id) {
return id % size;
}
public void addUser(User user) {
int num = hashFun(user.getId());
list.get(num).add(user);
}
public void show() {
for (List<User> users : list) {
System.out.println(users);
}
}
public User find(int id) {
User user = null;
int num = hashFun(id);
for (int i = 0; i < list.get(num).size(); i++) {
if (list.get(num).get(i).getId() == id) {
user = list.get(num).remove(i);
}
}
return user;
}
}
public class HashTest {
public static void main(String[] args) {
HashTab hashTab = new HashTab(10);
hashTab.addUser(new User(1564, "张三"));
hashTab.addUser(new User(4587, "李四"));
hashTab.addUser(new User(9874, "王五"));
hashTab.show();
System.out.println(hashTab.find(1));
System.out.println(hashTab.find(4587));
hashTab.show();
}
}