Java - 数组排序 -- 浅析稳定性与复杂度
上次我们了解了对数组的基本操作,那么谈到数组,我们就不得不谈谈数组的排序
什么是排序
排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列 -- 百度百科
排序是我们经常需要使用到的数据操作,比如最常见的对学生成绩进行排序、对商品价格进行排序以及对文件进行文件夹排序等等
稳定性
一个算法,对于一个序列中的相同元素,如果排序后的相对位置保持不变,那么我们就认为该算法是稳定的,举个栗子:
原序列
序列【,5,6,3,4,】
编号【0,1,2,3,4,5】
排序后
序列【,,3,4,5,6】
编号【0,5,3,4,1,2】
如上,排序好后,编号5代表的2元素依然在编号0代表的2元素的后面,此时,我们就认为该排序算法是稳定的
稳定性有什么作用
那么有人就问了,能排好序不就行了么,为什么还要要求稳定性呢,稳定性有什么用呢?
还是那个栗子,我们需要对编号1-100的学生的成绩进行排序,对于相同分数的人,我们多会要求其按照原来的编号顺序进行排列,此时我们就需要对其进行稳定排序啦
时间复杂度与空间复杂度
时间复杂度是一个函数,它描述的是运行该算法所需要的时间,即执行该算法所需要的计算工作量。
空间复杂度是指算法在运算的过程中临时占的储存空间的大小,即执行该算法所用的储存空间。(摘自百度百科)
简单来说:时间复杂度就是用来描述算法运行的时间,但是当我们在运行算法之前,该怎么描述时间复杂度呢,或者每次算法运行时间都有那么一些细微的差别,我们又以哪个为准呢???其实,如果我们定义每一次基本操作运行时间都是相同的,复杂度是通过运行基本操作的次数来表示其时间复杂度的
一个简单的例子:
public static void main(String[] args) { int n=10;
// (1)执行了n次
for (int i = 0; i < n; i++) {
// 执行了n此
for (int j = 0; j < n; j++) {
System.out.println("执行了一次");
}
// 执行了n此
for (int j = 0; j < n; j++) {
System.out.println("执行了一次");
}
} // (2)执行了n此
for (int j = 0; j < n; j++) {
System.out.println("执行了一次");
} System.out.println("执行了一次");
}
此例中第一个(1)for循环每执行一次其内部都会又执行两次n次,所以其执行的次数为n(2n),而第二个(2)for循环又会执行n次,再加上末尾有个打印语句,所以可以表示其运行时间为T(n)=2n2+n+1;但是我们知道计算机的执行速度非常快,其单次运行的时间可以忽略不计,所以T(n)近等于2n2+n,此时虽然看起来比较好了但是还不够,尤其是当一个式子比较复杂时依然看起来比较麻烦,而我们知道,当n的值越大时,其最高项系数决定了该函式的主要趋势,所以我们只保留其函式的最高项,并去除其常数系数,用来表示其时间复杂度的渐进趋势,称为渐进时间复杂度,用O来表示,所以此例的渐进时间复杂度表示为O(n2)
附几个常见函数的趋势图:
稳定排序
插入排序
冒泡排序、鸡尾酒排序、地精排序
计数排序、基数排序、桶排序
归并排序
非稳定排序
选择排序
希尔排序
堆排序
快速排序、内省排序
以及不太实用的排序
睡眠排序
猴子排序
面条排序
珠算排序
Java - 数组排序 -- 浅析稳定性与复杂度的更多相关文章
- Java数组排序
Java数组排序Arrays.sort,以及Comparator接口的用法 有的时候需要对数组里的element进行排序.当然可以自己编写合适的排序方法,但既然java包里有自带的Arrays.sor ...
- Java NIO浅析 转至 美团技术团队
出处: Java NIO浅析 NIO(Non-blocking I/O,在Java领域,也称为New I/O),是一种同步非阻塞的I/O模型,也是I/O多路复用的基础,已经被越来越多地应用到大型应用服 ...
- Java 比较两张图片的相似度
import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; /** * 比较两张图片 ...
- Java利用hanlp完成语句相似度分析的案例详解
分享一篇hanlp分词工具使用的小案例,即利用hanlp分词工具分析两个中文语句的相似度的案例.供大家一起学习参考! 在做考试系统需求时,后台题库系统提供录入题目的功能.在录入题目的时候,由于题目来源 ...
- JAVA 比较两张图片的相似度的代码
原文:http://www.open-open.com/code/view/1448334323079 import java.awt.image.BufferedImage; import java ...
- JAVA比较两张图相似度
代码: package com.uiwho.com; import javax.imageio.*; import java.awt.image.*; import java.awt.*;//Colo ...
- JAVA序列化浅析
java.io.Serializable浅析 Java API中java.io.Serializable接口源码: 1 public interface Serializable { 2 } 类通过实 ...
- Java NIO浅析
NIO(Non-blocking I/O,在Java领域,也称为New I/O),是一种同步非阻塞的I/O模型,也是I/O多路复用的基础,已经被越来越多地应用到大型应用服务器,成为解决高并发与大量连接 ...
- Java内存浅析分类
当jvm运行起来的时候,它会向系统申请一片内存区(不同的jvm实现可能不同,有些可以使用虚拟内存),并将这块内存分出一部分存储程序创建的对象,传递给方法的参数,返回值,局部变量等等,我们将这块内存称之 ...
随机推荐
- 51nod 1630(定积分 + 期望)
51nod1630 每个人进入竞技场后,会等概率随机匹配一个人,匹配到的人与当前胜利和失败场数无关. 胜利达到x场,或失败达到y场后,退出竞技场,根据退出时的胜利场数获得奖励,不能中途放弃. 水平高的 ...
- 第一个thinkphp项目遇到的知识
本文是于项目完成后所写,基本是想到 哪写到哪,所以顺序会很乱. 1.在后台处理ueditor这种文本编辑器的时候,会遇到取值问题,如果你想要取纯文本内容:getContentTxt(),没有段落格式: ...
- JMeter的介绍和简单使用
Apache官网(https://jmeter.apache.org/)对JMeter的解释: Apache JMeter™ Apache JMeter™应用程序是开源软件, 为负载功能和性能测试 ...
- 04-oracle中的视图
1.创建视图 介绍: 视图(View)通过SELECT查询语句定义,它是从一个或多个表(或视图)导出的,用来导出视图的表称为基表(Base Table),导出的视图称为虚表.在数据库中,只存储视图的定 ...
- Python高级笔记(五)--实例方法、静态方法和类方法
1. 类属性.实例属性 类属性在内存中只保存一份 实例属性在每个对象中都要保持一份 obj.__class__.country="xxx": 可以修改类属性 2. 实例方法.静态方 ...
- ORACLE not available
1 先看oracle的监听和oracle的服务是否都启动了. 启动oracle监听:cmd命令行窗口下,输入lsnrctl start,回车即启动监听. 2 查看oracle的sid叫什么,比如创建数 ...
- 爬一下国家统计局行政区划代码C#
目前NBS上有2015-2018四个年度的代码信息,写一个控制台程序爬一下县级行政区下的代码. 使用HttpWebRequest+HttpWebResponse获取html,使用HtmlAgility ...
- 爬虫框架Scrapy 之(一) --- scrapy初识
Scrapy框架简介 scrapy是基于Twisted的一个第三方爬虫框架,许多功能已经被封装好,方便提取结构性的数据.其可以应用在数据挖掘,信息处理等方面.提供了许多的爬虫的基类,帮我们更简便使用爬 ...
- Oracle ORA-08104报错处理方法及注意事项
[环境介绍] 系统环境:IBM P740 8205-E6C (AIX) + 11.2.0.3.0 Oracle RAC [背景介绍] 故障描述:数据库表空间超过90%,无法进行扩容表空间,需要业务侧清 ...
- 虚拟机有QQ消息时宿主机自动弹窗提示
因为是检测窗口实现的,所以要求设置会话窗口自动弹出,而且看完消息就把QQ消息窗口关掉... 虚拟机端 #! /usr/bin/env python # -*- coding: utf-8 -*- fr ...