zoukankan      html  css  js  c++  java
  • 常见排序算法JAVA实现

    1、冒泡排序,时间复杂度:最好:T(n) = O(n) ,情况:T(n) = O(n2) ,平均:T(n) = O(n2)

    public int[] bubbleSort(int[] nums) {
            if (nums.length < 2) {
                return nums;
            }
            for (int i = 0; i < nums.length; i++) {
                for (int j = 0; j < nums.length - 1 - i; j++) {
                    if (nums[j] > nums[j + 1]) {
                        int tem = nums[j];
                        nums[j] = nums[j + 1];
                        nums[j + 1] = tem;
                    }
                }
            }
            return nums;
        }

    2、选择排序,时间复杂度:最好:T(n) = O(n2) ,最差:T(n) = O(n2) ,平均:T(n) = O(n2)

    public int[] selectSort(int[] nums) {
            if (nums.length < 2) {
                return nums;
            }
            for (int i = 0; i < nums.length - 1; i++) {
                int minIndex = i;
                for (int j = i + 1; j < nums.length; j++) {
                    if (nums[minIndex] > nums[j]) {
                        minIndex = j;
                    }
                }
                if (minIndex != i) {
                    int tem = nums[i];
                    nums[i] = nums[minIndex];
                    nums[minIndex] = tem;
                }
            }
            return nums;
        }

    3、插入排序,时间复杂度:最好:T(n) = O(n) ,情况:T(n) = O(n2) ,平均:T(n) = O(n2)

    public int[] insertSort(int[] nums) {
            if (nums.length < 2) {
                return nums;
            }
            for (int i = 0; i < nums.length - 1; i++) {
                int cur = nums[i + 1];
                int per = i;
                while (per >= 0 && nums[per] > cur) {
                    nums[per + 1] = nums[per];
                    per--;
                }
                nums[per + 1] = cur;
            }
            return nums;
        }

     4、快速排序,时间复杂度:最好:T(n) = O(nlogn) ,最差:T(n) = O(n2), 平均:T(n) = O(nlogn)。它无法保证相等的元素相对位置不变,是不稳定的排序

    public int[] quickSort(int[] nums) {
        if (nums.length < 2) {
            return nums;
        }
        sort(nums, 0, nums.length - 1);
        return nums;
    }
    
    private void sort(int nums[], int low, int high) {
        int l = low, h = high;
        int povit = nums[low];
        while (l < h) {
            while (l < h && nums[h] >= povit)
                h--;
            if (l < h) {
                nums[l] = nums[h];
                l++;
            }
            while (l < h && nums[l] <= povit)
                l++;
            if (l < h) {
                nums[h] = nums[l];
                h--;
            }
        }
        nums[l] = povit;
        if (l - 1 > low)
            sort(nums, low, l - 1);
        if (h + 1 < high)
            sort(nums, h + 1, high);
    }

     5、归并排序,时间复杂度:最好:T(n) = O(n) ,最差:T(n) = O(nlogn) ,平均:T(n) = O(nlogn)

    public int[] mergeSort(int[] nums) {
        if (nums.length < 2) {
            return nums;
        }
        int mid = nums.length / 2;
        int[] nums1 = Arrays.copyOfRange(nums, 0, mid);
        int[] nums2 = Arrays.copyOfRange(nums, mid, nums.length);
        return merge(mergeSort(nums1), mergeSort(nums2));
    }
    
    private int[] merge(int[] nums1, int[] nums2) {
        int[] back = new int[nums1.length + nums2.length];
        for (int i = 0, m = 0, n = 0; i < back.length; i++) {
            if (m == nums1.length) {
                back[i] = nums2[n++];
            } else if (n == nums2.length) {
                back[i] = nums2[m++];
            } else if (nums1[m] < nums2[n]) {
                back[i] = nums1[m++];
            } else {
                back[i] = nums2[n++];
            }
        }
        return back;
    }
  • 相关阅读:
    ubuntu16.04本地软件源搭建
    2080TI显卡ubuntu16.04机器学习安装和克隆
    PLSQL导入excel数据方法
    只有英伟达显卡输出口的电脑安装ubuntu系统记录
    百度人脸识别学习
    http application/x-www-form-urlencoded 模式响应学习
    JS中继承的几种实现方式
    浅拷贝和深拷贝
    防抖和节流
    HTML知识点总结
  • 原文地址:https://www.cnblogs.com/zhi-leaf/p/10722576.html
Copyright © 2011-2022 走看看