Java的时间复杂度和空间复杂度和常见排序

        

目录

一丶时间复杂度

二丶空间复杂度

三丶Java常见排序

       1. 冒泡排序(Bubble Sort)

        2.插入排序(Insertion Sort)

         3.希尔排序(Shell Sort)

         4.选择排序(Selection Sort)

          5.堆排序(Heap Sort)

           6.归并排序(Merge Sort)

           7.快速排序(Quick Sort)

        8.计数排序(Counting Sort)、桶排序(Bucket Sort) 和 基数排序(Radix Sort)


        简介:时间复杂度和空间复杂度是评估算法性能的两个重要指标,他们分别用于衡量算法执行时间长短和算法所存储空间大小;

一丶时间复杂度

        时间复杂度:他描述了算法执行所需时间和数据规模之间的关系。具体来说,时间复杂度是算法中基本操作语句执行的次数,这次次数随着数据规模的增大而增大。时间复杂度通常用大O表示法(Big O notation)来表示,他忽略了常数因子和低阶项,只保留最高阶项,从而简洁明了的表示出算法的时间增长趋势;例如

  • O(1):表示算法的执行时间是固定,与输入规模无关;
  • O(log n):表示算法的执行时间与输入规模的对数成正比;
  • O(n):表示线性时间复杂度,算法的执行时间与输入规模成线性比例增长;
  • O(n log n):表示算法的执行时间与输入规模的线性对数比例增长;
  • O(n^2):表示平方时间复杂度,算法的执行时间与输入规模的平方成比例增长。

通过分析算法的时间复杂度,可以评估算法的性能,优化算法的效率,从而提高程度的执行速度。

二丶空间复杂度

        空间复杂度:它描述了算法在运行过程中临时占用存储空间的大小与数据规模之间的关系。空间复杂度也是用大O表示法来表示,他衡量的是算法运行过程中额外消耗的存储空间。例如

  • O(1):表示算法的空间复杂度是固定的,与输入规模无关;
  • O(log n):表示线性空间复杂度,算法所需内存与输入规模成线性比例增长
  • O(n^2):表示平方空间复杂度,算法所需内存与输入规模的平方成比例增长。

通过分析算法的空间复杂度,可以避免内存的浪费,提高空间利用率,从而降低算法执行成本,提高程序性能;

三丶Java常见排序

       1. 冒泡排序(Bubble Sort)

        原理:通过重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复的进行直到没有再需要交换,也就是说该数列已经排序完成。

        特点:简单,稳定,单效率低。时间复杂度O(n^2),空间复杂度O(1);

    //冒泡排序public static void bubbleSort(int[] arr) {int n = arr.length;for (int i = 0; i < n-1; i++) {for (int j = 0; j < n-i-1; j++) {if (arr[j] > arr[j+1]) {int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}}
        2.插入排序(Insertion Sort)

        原理:通过构建有序序列,对于未排序数据,在已排序序序列中从后向前扫描,找到相应位置插入;

        特点:稳定排序,适用于少量数据的排序,但是数据接近有序时效率较高。时间复杂度最好的情况下O(n),最坏的情况下O(n^2);空间复杂度O(1);

    //直接插入排序public static void insertionSort(int[] arr) {int n = arr.length;for (int i = 1; i < n; i++) {//取出第二个数据,默认已经排序int key = arr[i];//获取前以为数据的索引int j = i-1;/* 将 arr[0..i-1] 中大于 key 的元素移动到其当前位置的前 1 个位置*/while (j >=0 && arr[j] > key) {arr[j+1] = arr[j];j = j-1;}arr[j+1] = key;}}
         3.希尔排序(Shell Sort)

        原理:是插入排序的一种更高效的改进版本。希尔排序又称为缩小量排序,它将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录基本有序,在对全体记录进行直接插入排序;

        特点:不稳定的排序,时间复杂度依赖于增量序列的选择,但平均性能优于直接插入排序;

时间复杂度:O(n^1.3),空间复杂度O(1);

    //直接排序public static void shellSort(int[] arr) {int n = arr.length;for (int gap = n/2; gap > 0; gap /= 2) {for (int i = gap; i < n; i += 1) {int temp = arr[i];int j;for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {arr[j] = arr[j - gap];}arr[j] = temp;}}}
         4.选择排序(Selection Sort)

        原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾;

        特点:不稳定排序,时间复杂度:O(n^2),空间复杂度:O(1);

    //选择排序public void selectionSort(int[] arr) {int n = arr.length;for (int i = 0; i < n-1; i++) {int min_idx = i;for (int j = i+1; j < n; j++) {if (arr[j] < arr[min_idx]) {min_idx = j;}}// 将找到的 Minimum 元素与第一个元素交换int temp = arr[min_idx];arr[min_idx] = arr[i];arr[i] = temp;}}
          5.堆排序(Heap Sort)

        原理:是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子节点的键值或索引总是小于(或大于)他的父节点;

        特点:不稳定排序,时间复杂度:O(n log n),空间复杂度:O(1);

// 构建最大堆(辅助函数)  
void buildMaxHeap(int arr[]) {  int n = arr.length;  for (int i = n / 2 - 1; i >= 0; i--)  heapify(arr, n, i);  
}  // 调整给定的堆  
void heapify(int arr[], int n, int i) {  int largest = i; // 初始化最大为根  int l = 2 * i + 1; // 左 = 2*i + 1  int r = 2 * i + 2; // 右 = 2*i + 2  // 如果左子节点大于根  if (l < n && arr[l] > arr[largest])  largest = l;  // 如果右子节点是最大值  if (r < n && arr[r] > arr[largest])  largest = r;  // 如果最大值不是根  if (largest != i) {  int swap = arr[i];  arr[i] = arr[largest];  arr[largest] = swap;  // 递归地堆化受影响的子树  heapify(arr, n, largest);  }  
}  // 堆排序函数  
void heapSort(int arr[]) {  int n = arr.length;  buildMaxHeap(arr);  // 一个个从堆顶取出元素  for (int i = n - 1; i > 0; i--) {  // 移动当前根到末尾  int temp = arr[0];  arr[0] = arr[i];  arr[i] = temp;  // 调用max heapify on the reduced heap  heapify(arr, i, 0);  }  
}
           6.归并排序(Merge Sort)

        原理:是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序;

        特点:稳定排序,时间复杂度:O(n log n),空间复杂度:O(n);

public void mergeSort(int[] arr, int l, int r) {  if (l < r) {  // Same as (l+r)/2, but avoids overflow for  // large l and h  int m = l+(r-l)/2;  // Sort first and second halves  mergeSort(arr, l, m);  mergeSort(arr, m+1, r);  merge(arr, l, m, r);  }  
}  // 合并两个已排序的数组部分  
void merge(int arr[], int l, int m, int r) {  // Find sizes of two subarrays to be merged  int n1 = m - l + 1;  int n2 = r - m;  /* Create temp arrays */  int L[] = new int[n1];  int R[] = new int[n2];  /*Copy data to temp arrays*/  for (int i=0; i<n1; ++i)  L[i] = arr[l + i];  for (int j=0; j<n2; ++j)  R[j] = arr[m + 1+ j];  /* Merge the temp arrays */  // Initial indexes of first and second subarrays  int i = 0, j = 0;  // Initial index of merged subarray array  int k = l;  while (i < n1 && j < n2) {  if (L[i] <= R[j]) {  arr[k] = L[i];  i++;  } else {  arr[k] = R[j];  j++;  }  k++;  }  /* Copy remaining elements of L[] if any */  while (i < n1) {  arr[k] = L[i];  i++;  k++;  }  /* Copy remaining elements of R[] if any */  while (j < n2) {  arr[k] = R[j];  j++;  k++;  }  
}
           7.快速排序(Quick Sort)

        原理:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列;

        特点:平均时间复杂度:O(n log n),但是最坏的情况下时间复杂度会变成O(n^2)。空间复杂度取决于递归深度,平均为O(n log n),但最坏情况下需要O(n)的额外空间;

public void quickSort(int[] arr, int low, int high) {  if (low < high) {  // pi is partitioning index, arr[p] is now  // at right place  int pi = partition(arr, low, high);  // Separately sort elements before  // partition and after partition  quickSort(arr, low, pi - 1);  quickSort(arr, pi + 1, high);  }  
}  // 该方法用于分区数组,返回分区索引  
int partition(int arr[], int low, int high) {  int pivot = arr[high];  int i = (low - 1); // index of smaller element  for (int j = low; j < high; j++) {  // If current element is smaller than or  // equal to pivot  if (arr[j] <= pivot) {  i++;  // swap arr[i] and arr[j]  int temp = arr[i];  arr[i] = arr[j];  arr[j] = temp;  }  }  // swap arr[i+1] and arr[high] (or pivot)  int temp = arr[i + 1];  arr[i + 1] = arr[high];  arr[high] = temp;  return i + 1;  
}
        8.计数排序(Counting Sort)桶排序(Bucket Sort) 和 基数排序(Radix Sort)
  • 这些排序算法是非比较型排序算法,其排序效率在某些情况下会高于比较型排序算法。它们各自适用于一定范围的数据,如计数排序适用于一定范围内的整数排序,桶排序和基数排序则适用于外部排序和大数据排序。

 

结尾:喜欢的朋友点个赞吧!!! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/419647.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qmt量化交易策略小白学习笔记第61期【qmt编程之期权行情数据--get_market_data_ex函数】

qmt编程之获取期权数据 期权行情数据 qmt更加详细的教程方法&#xff0c;会持续慢慢梳理。 也可找寻博主的历史文章&#xff0c;搜索关键词查看解决方案 &#xff01; 获取期权行情数据 获取期权最新数据&#xff0c;首先需要进行数据订阅。完成合约订阅后&#xff0c;用g…

【OpenCV】灰度化处理

文章目录 1. 图像灰度化处理对比2. 代码示例3. 二值化处理 1. 图像灰度化处理对比 2. 代码示例 #include <opencv2/opencv.hpp> using namespace cv;int main() {Mat currentImage imread("path_to_image.jpg"); // 读取彩色图像Mat grayImage;// 将彩色图像…

Rust的常数、作用域与所有权

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust到底值不值得学&#xff0c;之一 -CSDN博客 Rust到底值不值得学&#xff0c;之二-CSDN博客 Rust的数据类型-CSDN博客 3.7 常…

HTTP 二、进阶

四、安全 1、TLS是什么 &#xff08;1&#xff09;为什么要有HTTPS ​ 简单的回答是“因为 HTTP 不安全”。由于 HTTP 天生“明文”的特点&#xff0c;整个传输过程完全透明&#xff0c;任何人都能够在链路中截获、修改或者伪造请求 / 响应报文&#xff0c;数据不具有可…

阿里不认命

​ 转载&#xff1a;新熵 原创 作者丨萧维 编辑丨影蕨 国家定调了&#xff01;一系列积极信号为平台经济注入一剂强心针&#xff0c;阿里迎来新生。 最近&#xff0c;阿里捷报频传&#xff01; 先是8月28日&#xff0c;阿里巴巴完成香港双重主要上市。紧接着&#xff0c;8月…

基于聚类与LSTM对比特币价格深度分析与预测

1.项目背景 比特币作为全球最具影响力的加密货币之一&#xff0c;其价格受到多种复杂因素的共同作用&#xff0c;包括市场情绪、政策变化、大型机构的投资行为等&#xff0c;这些因素在不同的市场阶段对比特币价格波动产生直接或间接的影响。通过对比特币市场的深入分析&#…

66城代表齐聚!蓝卓分享“全国经验”,批量复制推动中小企业数字化转型

9月6日下午&#xff0c;2024中小企业数字化转型现场交流活动在浙江宁波隆重举行。 全国66个中小企业试点城市500多名中小企业主管部门及专家学者&#xff0c;制造业企业、数字化转型服务商等重点企业代表齐聚宁波&#xff0c;共同探讨中小企业数字化转型的模式和路径。 工业和…

酒店智能轻触开关:智慧化的创新实践

在追求高品质住宿体验的今天&#xff0c;酒店智能轻触开关作为智慧酒店建设的关键一环&#xff0c;正逐步成为提升酒店服务品质、优化运营效率、增强顾客满意度的有力工具。本文将深入探讨酒店智能轻触开关如何助力酒店实现智慧化管理&#xff0c;以及它所带来的多重变革。 一、…

VSCode连接docker

1.启动ssh服务 vim /root/.bashrc 或者 vim ~/.bashrc /usr/sbin/sshd #启动ssh服务~代表主目录&#xff0c;cd ~会返回root目录 cd / 返回最根上的目录 为了防止每次打开容器都要输入此指令&#xff0c;我们直接在 ~/.bashrc文件最后一行添加sshd启动命令即可。 打开终端…

【JAVA开源】基于Vue和SpringBoot的图书个性化推荐系统

本文项目编号 T 015 &#xff0c;文末自助获取源码 \color{red}{T015&#xff0c;文末自助获取源码} T015&#xff0c;文末自助获取源码 目录 一、系统介绍1.1 业务分析1.2 用例设计1.3 时序设计 二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究…

掌握ChatGPT写论文六步提问法,会提问才能写出优质好论文

大家好,感谢关注。我是七哥,一个在高校里不务正业,折腾学术科研AI实操的学术人。关于使用ChatGPT等AI学术科研的相关问题都可以分享,相互成就,共同进步,为大家带来最酷最有效的智能AI学术科研写作攻略。 今天给大家分享的是借助GPT一年发两篇SCI的学术大拿总结的ChatGPT六…

IPS和IDS有啥区别?

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330&scene21#wechat_redirect 《网安面试指南》…

ChatGPT付费创作系统V3.0.6独立版 WEB+H5+小程序端 (新增AI全网搜索+文档解析+豆包AI通道)安装部署教程

播播资源GPT付费体验系统最新版系统是一款基于ThinkPHP框架开发的AI问答小程序&#xff0c;是基于国外很火的ChatGPT进行开发的Ai智能问答小程序。这是一种基于人工智能技术的问答系统&#xff0c;可以实现智能回答用户提出的问题。相比传统的问答系统&#xff0c;ChatGPT可以更…

认识Linux及Linux的环境搭建

目录 1、什么是Linux2、Linux环境搭建2.1 下载安装 Xshell2.2 下载安装 VMware Workstation Pro2.3 选择适合自己系统 1、什么是Linux Linux&#xff0c;一般指GNU/Linux&#xff08;单独的Linux内核并不可直接使用&#xff0c;一般搭配GNU套件&#xff0c;故得此称呼&#xff…

ARM基础知识---CPU---处理器

目录 一、ARM架构 1.1.RAM---随机存储器 1.2.ROM---只读存储器 1.3.flash---闪存存储器 1.4.时钟&#xff08;振晶&#xff09; 1.5.复位 二、CPU---ARM920T 2.1.R0~R12---通用寄存器 2.2.PC程序计数器 2.3.LR连接寄存器 2.4.SP栈指针寄存器 2.5.CPSR当前程序状态寄存…

java,php,go,nodejs,Python开发web项目优缺点对比

Java 优点:java 是一门广泛应用于企业级开发的语言,丰富且庞大的开发框架和库。有较高的性能和可伸缩性。生态系统庞大且成熟,拥有大量的开源框架和工具,可以加速开发过程。 内置对多线程的支持,适合处理高并发的 Web 项目。 缺点:相比其他语言,Java 的语法相对冗长繁琐…

【H2O2|全栈】关于Photoshop | PS(4)

PS的一些杂谈&#xff08;亖&#xff09; 目录 PS的一些杂谈&#xff08;亖&#xff09; 前言 准备工作 图形工具 基本属性 混合选项 形状图层 文字工具 基本属性 进一步变化文字 组和图层 UI设计案例 预告和回顾 后话 前言 这一篇博客我将会写一下图形工具和…

【C++】STL学习——priority_queue(了解仿函数)

目录 priority_queue介绍迭代器种类priority_queue实现仿函数仿函数的使用 priority_queue介绍 优先队列是一种容器适配器&#xff0c;根据严格的弱排序标准&#xff0c;它的第一个元素总是它所包含的元素中最大的。此上下文类似于堆&#xff0c;在堆中可以随时插入元素&#x…

Python | Leetcode Python题解之第394题字符串解码

题目&#xff1a; 题解&#xff1a; class Solution:def decodeString(self, s: str) -> str:def dfs(s, i):res, multi "", 0while i < len(s):if 0 < s[i] < 9:multi multi * 10 int(s[i])elif s[i] [:i, tmp dfs(s, i 1)res multi * tmpmulti…

SpringCache源码解析(三)——@EnableCaching

一、源码阅读 让我们进行源码阅读把。 1.1 阅读源码基础&#xff1a; Import(xxx.class)里的类可以有两种类&#xff1a; ImportSelector接口的实现类&#xff1b;ImportBeanDefinitionRegistrar接口的实现类&#xff1b; 两种接口简介&#xff1a; ImportSelector接口&am…