排序总结Java

文章目录


排序算法复杂度总结

提示:这里可以添加本文要记录的大概内容:

插入排序

java 复制代码
public class Sort {
    // 插入排序
    public int[] inserSort(int[] nums)
    {
        for (int i = 1; i < nums.length; i ++)
        {
            int pre = i - 1;
            int cur = nums[i];
            while (pre >= 0 && nums[pre] > cur)
            {
                nums[pre + 1] = nums[pre];
                pre -= 1;
            }
            nums[pre + 1] = cur;
        }
        return nums;
    }
  }

算法分析:

  • 稳定性:稳定
  • 时间复杂度 :最佳: O ( n ) O(n) O(n);最差: O ( n 2 ) O(n^2) O(n2);平均: O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度 : O ( 1 ) O(1) O(1)

希尔排序

java 复制代码
public class Sort {
    // 希尔排序
    public int[] shellSort(int[] nums)
    {
        int n = nums.length;
        int gap = n / 2;
        while (gap > 0)
        {
            for (int i = gap; i < n; i ++)
            {
                int pre = i - gap;
                int cur = nums[i];
                while (pre >= 0 && nums[pre] > cur)
                {
                    nums[pre + gap] = nums[pre];
                    pre -= gap;
                }
                nums[pre + gap] = cur;
            }
            gap /= 2;
        }
        return nums;
    }
  }

算法分析:

  • 稳定性:不稳定
  • 时间复杂度 :最佳: O ( n l o g n ) O(nlogn) O(nlogn);最差: O ( n 2 ) O(n^2) O(n2);平均: O ( n l o g n ) O(nlogn) O(nlogn)
  • 空间复杂度 : O ( 1 ) O(1) O(1)

归并排序

java 复制代码
public class Sort {
    // 归并排序
    public int[] merge(int[] nums1, int[] nums2)
    {
        int[] num = new int[nums1.length + nums2.length];
        int id = 0, id1 = 0, id2 = 0;
        while (id1 < nums1.length && id2 < nums2.length)
        {
            if (nums1[id1] < nums2[id2])
            {
                num[id] = nums1[id1];
                id1 ++;
            }else{
                num[id] = nums2[id2];
                id2 ++;
            }
            id ++;
        }
        if (id1 < nums1.length)
        {
            num[id ++] = nums1[id1 ++];
        }
        if (id2 < nums2.length)
        {
            num[id ++] = nums2[id2 ++];
        }
        return num;
    }
    public int[] mergeSort(int[] nums)
    {
        int n = nums.length;
        if (n == 1) return nums;
        int mid = n / 2;
        int[] nums1 = Arrays.copyOfRange(nums,0,mid);
        int[] nums2 = Arrays.copyOfRange(nums,0,n);
        return merge(mergeSort(nums1),mergeSort(nums2));
    }
  }

算法分析:

  • 稳定性:稳定
  • 时间复杂度 :最佳: O ( n l o g n ) O(nlogn) O(nlogn);最差: O ( n l o g ) O(nlog) O(nlog);平均: O ( n l o g n ) O(nlogn) O(nlogn)
  • 空间复杂度 : O ( n ) O(n) O(n)

快速排序

java 复制代码
public class Sort {
    // 快速排序
    public int partion(int[] nums, int low, int high)
    {
        int index = high;
        int sindex = low;
        for (int i = low; i < high; i ++)
        {
            if (nums[i] <= nums[index])
            {
                int tmp = nums[sindex];
                nums[sindex] = nums[i];
                nums[i] = tmp;
                sindex ++;
            }
        }
        int tmp = nums[index];
        nums[index] = nums[sindex];
        nums[sindex] = tmp;
        return sindex;
    }
    public void quick(int[] nums, int low, int high)
    {
        while (low < high)
        {
            int index = partion(nums, low, high);
            quick(nums,0,index - 1);
            quick(nums,index + 1,high);
        }
    }
    public int[] quickSort(int[] nums)
    {
        quick(nums,0, nums.length - 1);
        return nums;
    }
  }

算法分析:

  • 稳定性:不稳定
  • 时间复杂度 :最佳: O ( n l o g n ) O(nlogn) O(nlogn);最差: O ( n l o g ) O(nlog) O(nlog);平均: O ( n l o g n ) O(nlogn) O(nlogn)
  • 空间复杂度 : O ( l o g n ) O(logn) O(logn)

堆排序

java 复制代码
public class Sort {
	// 堆排序
	public int heapLen;
    public void swap(int[] nums, int i, int j)
    {
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }
    public void heapify(int[] nums, int largest)
    {
        int left = 2*largest + 1;
        int right = 2*largest + 2;
        int index = largest;
        if (left < heapLen && nums[left] > nums[largest])
        {
            index = left;
        }
        if (right < heapLen && nums[right] > nums[largest])
        {
            index = right;
        }
        if (index != largest)
        {
            swap(nums,index,largest);
            heapify(nums,largest);
        }
    }
    public void maxheapify(int[] nums)
    {
        for (int i = nums.length / 2 - 1; i >= 0; i --)
        {
            heapify(nums,i);
        }
    }
    public int[] heapSort(int[] nums)
    {
        heapLen = nums.length;
        maxheapify(nums);
        for (int i = heapLen - 1; i >= 0; i --)
        {
            swap(nums,0,i);
            heapLen --;
            heapify(nums,i);
        }
        return nums;

    }
  }

算法分析:

  • 稳定性:不稳定
  • 时间复杂度 :最佳: O ( n l o g n ) O(nlogn) O(nlogn);最差: O ( n l o g ) O(nlog) O(nlog);平均: O ( n l o g n ) O(nlogn) O(nlogn)
  • 空间复杂度 : O ( l o g n ) O(logn) O(logn)
相关推荐
威哥爱编程3 分钟前
【AI全栈12-11】Spring Boot 把 AI 接口真正上线扛量:限流 / 降级 / 可观测
java·spring boot·后端
小蒜学长3 分钟前
基于SpringBoot+uni-app的闪洁家政系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·uni-app·家政服务
yi01116 分钟前
DAY28: LeetCode 111. 二叉树的最小深度
人工智能·笔记·python·算法·leetcode·二叉树·递归
敲代码的彭于晏19 分钟前
2026 K8s 零基础入门:手把手教你一步步搭建 Kubernetes 集群
java·运维·全栈
希洛兔24 分钟前
状态模式详解:让对象随内部状态自动改变行为
java·设计模式·状态模式
wuyk55526 分钟前
27.LeetCode 2265. 统计值等于子树平均值的节点数 —— 后序遍历实战
stm32·单片机·嵌入式硬件·算法
需要82627 分钟前
Spring Boot 启动流程:run() 里到底发生了什么
java·spring boot·后端
云絮.30 分钟前
Mybatis(一)
java·数据库·mybatis
xiangyun6134 分钟前
C++ list 模拟实现(二):const迭代器与反向迭代器,模板的黑魔法
开发语言·数据库·c++·算法·stl·list
xxwl5851 小时前
三、区域赛算法模版第三章---字符串相关算法
笔记·学习·算法