数据结构与算法之排序、查找、哈希表

  • 时间复杂度顺序: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();
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值