博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java - 数组排序 -- 浅析稳定性与复杂度
阅读量:6716 次
发布时间:2019-06-25

本文共 1782 字,大约阅读时间需要 5 分钟。

上次我们了解了对数组的基本操作,那么谈到数组,我们就不得不谈谈数组的排序

什么是排序

排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列 -- 百度百科

排序是我们经常需要使用到的数据操作,比如最常见的对学生成绩进行排序、对商品价格进行排序以及对文件进行文件夹排序等等

稳定性

一个算法,对于一个序列中的相同元素,如果排序后的相对位置保持不变,那么我们就认为该算法是稳定的,举个栗子:

原序列

序列【2,5,6,3,4,2

编号【0,1,2,3,4,5】

排序后

序列【22,3,4,5,6】

编号【0,5,3,4,1,2】

如上,排序好后,编号5代表的2元素依然在编号0代表的2元素的后面,此时,我们就认为该排序算法是稳定的

稳定性有什么作用

那么有人就问了,能排好序不就行了么,为什么还要要求稳定性呢,稳定性有什么用呢?

还是那个栗子,我们需要对编号1-100的学生的成绩进行排序,对于相同分数的人,我们多会要求其按照原来的编号顺序进行排列,此时我们就需要对其进行稳定排序啦

时间复杂度与空间复杂度

时间复杂度是一个函数,它描述的是运行该算法所需要的时间,即执行该算法所需要的计算工作量。

空间复杂度是指算法在运算的过程中临时占的储存空间的大小,即执行该算法所用的储存空间。(摘自百度百科)

简单来说:时间复杂度就是用来描述算法运行的时间,但是当我们在运行算法之前,该怎么描述时间复杂度呢,或者每次算法运行时间都有那么一些细微的差别,我们又以哪个为准呢???其实,如果我们定义每一次基本操作运行时间都是相同的,复杂度是通过运行基本操作的次数来表示其时间复杂度的

一个简单的例子:

1     public static void main(String[] args) { 2          3         int n=10; 4         // (1)执行了n次 5         for (int i = 0; i < n; i++) { 6             // 执行了n此 7             for (int j = 0; j < n; j++) { 8                 System.out.println("执行了一次"); 9             }10             // 执行了n此11             for (int j = 0; j < n; j++) {12                 System.out.println("执行了一次");13             }14         }15         16         // (2)执行了n此17         for (int j = 0; j < n; j++) {18             System.out.println("执行了一次");19         }20         21         System.out.println("执行了一次");22     }

 此例中第一个(1)for循环每执行一次其内部都会又执行两次n次,所以其执行的次数为n(2n),而第二个(2)for循环又会执行n次,再加上末尾有个打印语句,所以可以表示其运行时间为T(n)=2n2+n+1;但是我们知道计算机的执行速度非常快,其单次运行的时间可以忽略不计,所以T(n)近等于2n2+n,此时虽然看起来比较好了但是还不够,尤其是当一个式子比较复杂时依然看起来比较麻烦,而我们知道,当n的值越大时,其最高项系数决定了该函式的主要趋势,所以我们只保留其函式的最高项,并去除其常数系数,用来表示其时间复杂度的渐进趋势,称为渐进时间复杂度,用O来表示,所以此例的渐进时间复杂度表示为O(n2)

附几个常见函数的趋势图:

 

 

 

稳定排序

插入排序

冒泡排序、鸡尾酒排序、地精排序

计数排序、基数排序、桶排序

 归并排序

 

非稳定排序

选择排序

希尔排序

堆排序

快速排序、内省排序

 

以及不太实用的排序

睡眠排序

猴子排序

面条排序

珠算排序

转载于:https://www.cnblogs.com/wangbingc/p/9913677.html

你可能感兴趣的文章
XP 系统如何安装.NET Framework4.0
查看>>
java分页功能代码
查看>>
WinForm------如何修改PanelControl控件背景色
查看>>
Android性能优化第(二)篇---Memory Monitor检测内存泄露
查看>>
linux网络命令
查看>>
.NET Core 2.0及.NET Standard 2.0
查看>>
Makefile生成器,使用C++和Boost实现
查看>>
ITOO之底层关系
查看>>
算法笔记_141:无向图的欧拉回路判断问题(Java)
查看>>
XX年年终总结---重新飞跃
查看>>
Spark学习笔记之-Spark远程调试
查看>>
js---06函数传参数
查看>>
WCF系列教程之WCF服务配置
查看>>
Makefile 11——支持头文件目录指定
查看>>
解决JsonFormat日期少一天问题
查看>>
POJ 1201 Intervals
查看>>
linux下串口调试工具
查看>>
[转]如何在 .Net Framework 4.0 项目上使用 OData?
查看>>
UVa 12279 - Emoogle Balance
查看>>
头文件algorithm中的常用函数
查看>>