Java中的排序

Java中的排序

排序方法的选择

1.若n较小(如n≤50),可采用直接插入或直接选择排序。当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插入,应选直接选择排序为宜。

2.若文件初始状态基本有序(指正序),则应选用直接插入、冒泡或随机的快速排序为宜;

3.若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序。

衡量排序算法的优劣:

1.时间复杂度:分析关键字的比较次数和记录的移动次数

2.空间复杂度:分析排序算法中需要多少辅助内存

3.稳定性:若两个记录A和B的关键字值相等,但排序后A、B的先后次序保持不变,则称这种排序算法是稳定的。

排序算法分类:内部排序和外部排序。

1.内部排序:整个排序过程不需要借助于外部存储器(如磁盘等),所有排序操作都在内存中完成。

2.外部排序:参与排序的数据非常多,数据量非常大,计算机无法把整个排序过程放在内存中完成,必须借助于外部存储器(如磁盘)。外部排序最常见的是多路归并排序。可以认为外部排序是由多次内部排序组成。

常用的内部排序

选择排序

基本原理:将待排序的元素分为已排序(初始为空)和未排序两组,依次将未排序的元素中值最小的元素放入已排序的组中。直接选择排序简单直观,但性能略差;堆排序是一种较为高效的选择排序方法,但实现起来略微复杂。

基本过程:1.在一组元素R[i]到R[n]中选择具有最小关键字的元素。2.若它与这组元素中的第一个元素,则将它与这组元素中的第一个元素对调。3.去除具有最小关键字的元素,在剩下的元素中重复1、2步,直到剩余元素只有一个为止。

算法的时间效率:无论初始状态如何,在第i趟排序中选择最小关键码的元素,需做n-i次比较,因此总的比较次数为:n(n-1)/2 = O(n^2)

算法的空间效率:空间效率很高,只需要一个附加程序单元用于交换,其空间效率为:O(1)

算法的稳定性:不稳定

public class SelectSort {public static void selectSort(DataWrap[] data) {System.out.println("开始排序");int arrayLength = data.length;for (int i = 0; i < arrayLength - 1; i++) {for (int j = i + 1; j < arrayLength; j++) {if (data[i].compareTo(data[j]) > 0) {DataWrap temp = data[i];data[i] = data[j];data[j] = temp;}}System.out.println(java.util.Arrays.toString(data));}}public static void main(String[] args) {DataWrap[] data = { new DataWrap(9, ""), new DataWrap(-16, ""),new DataWrap(21, "*"), new DataWrap(23, ""),new DataWrap(-30, ""), new DataWrap(-49, ""),new DataWrap(21, ""), new DataWrap(30, "*"),new DataWrap(30, "") };System.out.println("排序之前:\n" + java.util.Arrays.toString(data));selectSort(data);System.out.println("排序之后:\n" + java.util.Arrays.toString(data));}
}
堆排序

算法的时间效率:假设有n个数据,需要进行n-1次建堆,每次建堆本身耗时 logn,则其时间效率为O(nlogn)

算法的空间效率:空间效率很高,只需要一个附加程序单元用于交换,其空间效率为O(1)

算法的稳定性:不稳定

public class HeapSort {public static void heapSort(DataWrap[] data) {System.out.println("开始排序");int arrayLength = data.length;// 循环建堆for (int i = 0; i < arrayLength - 1; i++) {// 建堆builMaxdHeap(data, arrayLength - 1 - i);// 交换堆顶和最后一个元素swap(data, 0, arrayLength - 1 - i);System.out.println(java.util.Arrays.toString(data));}}// 对data数组从0到lastIndex建大顶堆private static void builMaxdHeap(DataWrap[] data, int lastIndex) {// 从lastIndex处节点(最后一个节点)的父节点开始for (int i = (lastIndex - 1) / 2; i >= 0; i--) {// k保存当前正在判断的节点int k = i;// 如果当前k节点的子节点存在while (k * 2 + 1 <= lastIndex) {// k节点的左子节点的索引int biggerIndex = 2 * k + 1;// 如果biggerIndex小于lastIndex,即biggerIndex +1// 代表k节点的右子节点存在if (biggerIndex < lastIndex) {// 如果右子节点的值较大if (data[biggerIndex].compareTo(data[biggerIndex + 1]) < 0) {// biggerIndex总是记录较大子节点的索引biggerIndex++;}}// 如果k节点的值小于其较大子节点的值if (data[k].compareTo(data[biggerIndex]) < 0) {// 交换它们swap(data, k, biggerIndex);// 将biggerIndex赋给k,开始while循环的下一次循环// 重新保证k节点的值大于其左、右节点的值k = biggerIndex;} else {break;}}}}// 交换data数组中i、j两个索引处的元素private static void swap(DataWrap[] data, int i, int j) {DataWrap temp = data[i];data[i] = data[j];data[j] = temp;}public static void main(String[] args) {DataWrap[] data = { new DataWrap(9, ""), new DataWrap(-16, ""),new DataWrap(21, "*"), new DataWrap(23, ""),new DataWrap(-30, ""), new DataWrap(-49, ""),new DataWrap(21, ""), new DataWrap(30, "*"),new DataWrap(30, "")};System.out.println("排序之前:\n" + java.util.Arrays.toString(data));heapSort(data);System.out.println("排序之后:\n" + java.util.Arrays.toString(data));}
}
冒泡排序

相邻两元素进行比较,如有需要则进行交换,每完成一次循环就将最大元素排在最后(如从小到大排序),下一次循环是将其它的数进行类似操作。

算法的时间效率:从冒泡排序的算法可以看出,若待排序的元素为正序,则只需进行一趟排序,比较次数为n-1次,移动元素次数为0;若待排序的元素为逆序,则需要进行n-1趟排序,比较次数为(n^2-n)/2 ,移动次数为3(n^2-n)/2,因此时间复杂度为O(n^2)

算法的空间效率:空间效率很高,只需要一个附加程序单元用于交换,其空间效率为O(1)

算法的稳定性:稳定

public class BubbleSort {public static void bubbleSort(DataWrap[] data) {System.out.println("开始排序");int arrayLength = data.length;for (int i = 0; i < arrayLength - 1; i++) {boolean flag = false;for (int j = 0; j < arrayLength - 1 - i; j++) {if (data[j].compareTo(data[j + 1]) > 0) {DataWrap temp = data[j + 1];data[j + 1] = data[j];data[j] = temp;flag = true;}}System.out.println(java.util.Arrays.toString(data));if (!flag)break;}}public static void main(String[] args) {DataWrap[] data = { new DataWrap(9, ""), new DataWrap(-16, ""),new DataWrap(21, "*"), new DataWrap(23, ""),new DataWrap(-30, ""), new DataWrap(-49, ""),new DataWrap(21, ""), new DataWrap(30, "*"),new DataWrap(30, "")};System.out.println("排序之前:\n" + java.util.Arrays.toString(data));bubbleSort(data);System.out.println("排序之后:\n" + java.util.Arrays.toString(data));}
}
快速排序

算法的时间效率:时间效率很好,因为每趟能确定的元素都呈指数增长,故时间复杂度为log(n+1)

算法的空间效率:由于使用递归,而递归使用栈,因此空间效率最优时为log(n)

算法的稳定性:由于包含跳跃式交换,因此不稳定

public class QuickSort {private static void swap(DataWrap[] data, int i, int j) {DataWrap temp = data[i];data[i] = data[j];data[j] = temp;}private static void subSort(DataWrap[] data, int start, int end) {if (start < end) {DataWrap base = data[start];int i = start;int j = end + 1;while (true) {while (i < end && data[++i].compareTo(base) <= 0);while (j > start && data[--j].compareTo(base) >= 0);if (i < j) {swap(data, i, j);} else {break;}}swap(data, start, j);subSort(data, start, j - 1);subSort(data, j + 1, end);}}public static void quickSort(DataWrap[] data){subSort(data,0,data.length-1);}public static void main(String[] args) {DataWrap[] data = { new DataWrap(9, ""), new DataWrap(-16, ""),new DataWrap(21, "*"), new DataWrap(23, ""),new DataWrap(-30, ""), new DataWrap(-49, ""),new DataWrap(21, ""), new DataWrap(30, "*"),new DataWrap(30, "") };System.out.println("排序之前:\n" + java.util.Arrays.toString(data));quickSort(data);System.out.println("排序之后:\n" + java.util.Arrays.toString(data));}
}

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

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

相关文章

Codeforces Round #493 (Div. 2) C. Convert to Ones 乱搞_构造_好题

题意&#xff1a; 给你一个长度为 nnn 的 010101串 &#xff0c;你有两种操作&#xff1a; 1.将一个子串翻转&#xff0c;花费 XXX 2.将一个子串中的0变成1&#xff0c;1变成0&#xff0c;花费 YYY 求你将这个01串变成全是1的串的最少花费。 首先&#xff0c;我们可以将串按照0…

[T-ARA][그녀를 보면][看着那个女人的话]

歌词来源&#xff1a;http://music.163.com/#/song?id29343995 作曲 : 코난 [作曲 : Ko-nan] 作词 : 코난/로코 [作词 : Ko-nan-/lo-Ko] baby i hate you [baby i hate you] but i love you [but i love you] cant live without you [cant live without you] baby i hate you …

node --- 连接mysql(docker环境) Sequelize库

mysql 数据库 [1] 首先配置 docker 环境 采用 docker-compose 方法 源码: /test-mysql/docker-compose.yml version: 3.1 services:mysql:image: mysqlcommand: --default-authentication-pluginmysql_native_passwordrestart: alwaysenvironment:MYSQL_ROOT_PASSWORD: examp…

Java-接口练习

Java-接口练习 编写2个接口&#xff1a;InterfaceA和InterfaceB&#xff1b;在接口InterfaceA中有个方法voidprintCapitalLetter()&#xff1b;在接口InterfaceB中有个方法void printLowercaseLetter()&#xff1b;然 后写一个类Print实现接口InterfaceA和InterfaceB&#xff0…

类模板与运算符重载(一个简单的例子)

类模板与运算符重载&#xff08;一个简单的例子&#xff09; 标签&#xff08;空格分隔&#xff09;&#xff1a; C 算法竞赛 下面是一段简单的代码&#xff0c;表示我们建立了一个类模板Vector&#xff0c;可以看做是对STL中vector的简单实现。 为了让这个Vector支持通过下标…

Java 试题一

Java 试题一 1、GC是什么? 为什么要有GC 答&#xff1a;GC是垃圾收集的意思&#xff08;Gabage Collection&#xff09;,内存处理是编程人员容易出现问题的地方&#xff0c; 忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃&#xff0c;Java提供的GC功能可以自动 …

操作系统 --- [笔记]功能、组成

操作系统的作用 管理计算机硬件充当计算机用户和计算机硬件的中介(操作系统控制硬件,协调各个用户应用程序的硬件) 计算机系统的资源 CPU时间、内存空间、文件存储空间、I/O设备等 操作系统的定义 如何定义一个操作系统: 计算机系统的根本目的是,执行用户程序并且更容易解…

Java 试题二

Java 试题二 1、哪个选项和show函数重载 class Demo{ void show(int a,int b,float c){} } A.void show(int a,float c,int b){}//yes B,void show(int a,int b,float c){}//一模一样。不可以出现在同一个类中。 C.int show(int a,float c,int b){return a;}//yes。 D.in…

Python之简单验证码实现

def v_code(): ret for i in range(5): num random.randint(0,9) alf chr(random.randint(65,122)) s str(random.choice([num,alf])) ret s return retprint(v_code())转载于:https://www.cnblogs.com/geeker-xjl/p/8809915.html

测绘软件使用体会

进入石家庄铁道大学已经两年了&#xff0c;学习测绘工程专业也已经两年了&#xff0c;大一的时候大多是对测绘不了解&#xff0c;到了大二的时候上半学期我就开始了解和使用一些测绘专业相关的软件&#xff0c;在大二下半学期实习的时候更是深入的学习和使用测绘软件&#xff0…

javascript --- event loop

栗子1 求下面函数的输出 console.log(script start);setTimeout(() > {console.log(setTimeoout); }, 0);Promise.resolve().then(function(){console.log(promise1); }).then(function(){console.log(promise2); }) console.log(script end);说明: 在"promise2"…

sublime 设置自动换行

1.打开sublime,点击preferences -> settings 2.将word_wrap的值由auto修改为true&#xff08;若没有word_wrap&#xff0c;手动添加&#xff09; 转载于:https://www.cnblogs.com/hitwgs/p/8821316.html

Java 试题三

Java 试题三 1、java类是否可以多继承&#xff0c;怎么实现多继承&#xff1f; 答&#xff1a;java没有多继承&#xff0c;但可以通过接口的形式来达到多继承的目地。 2、我比较两个String总是false&#xff0c;但是它们明明都是”abc” &#xff01; 答&#xff1a;比较Str…

Cent os常见操作命令

1.查看防火墙状态&#xff1a;firewall-cmd –-state 2.关闭防火墙&#xff1a;systemctl stop firewalld.service 3.禁止防火墙开机启动&#xff1a;systemctl disable firewalld.service 4.关闭selinux&#xff1a;vi /etc/selinux/config&#xff0c;然SELINUXdisabled 5.查…

koa --- 使用中间件多层级抛出错误

说明 能够熟练的掌握错误的抛出,可以在一定程度上提高代码的开发效率和可读性 构造错误 本栗采用调用一个不存在的函数来抛出错误 const Koa require(koa); const app new Koa();// 响应时间输出中间件 app.use(async (ctx, next) > {await next();// 获取响应头,印证…

电脑的真正价值

1.不是应用程序&#xff0c;而是开发程序 2.高级语言就像是人类的语言&#xff0c;低级语言就像是一个全心全意帮我的社交专家&#xff0c;他帮我说服电脑实现我的指令 3.高级语言就是字节码&#xff0c;低级语言帮我转换成机器码 4.有时候&#xff0c;高级语言的一个眼神&…

Java 试题四

Java 试题四 1、abstract class 和interface 有什么区别? 【基础】 答&#xff1a;声明方法的存在而不去实现它的类被叫做抽象类&#xff08;abstract class&#xff09;&#xff0c;它用于要创建一个体现某些基本行为的类&#xff0c; 并为该类声明方法&#xff0c;但不能…

PyInstaller用法

pyinstaller定义&#xff1a;PyInstaller是一个压缩python文件成为可执行程序的一个软件。 pyinstaller工作原理&#xff1a;① 它会扫描你所有的Python文档&#xff0c;并分析所有代码从而找出所有你的代码运行所需的模块。② PyInstaller会将所有这些模块和你的code放在一个文…

koa --- 监听路由,并使用模板引擎渲染显示

使用路由 /Koa实战/routes/index.js const Router require(koa-router); const router new Router();router.get(/, ctx > {ctx.body index; });module.exports router/Koa实战/routes/users.js const Router require(koa-router); const router new Router({prefi…

公共平台服务治理与鉴权

问题 解决问题 鉴权 注册 管理 总结聊一聊最近了解的公司服务治理平台&#xff0c;主要是思想&#xff0c;理念&#xff0c;而不是一种技术或框架。整个平台设计&#xff0c;融入了OAUTH2认证&#xff0c;融入了微服务思想&#xff0c;帮助公司各系统在复杂的IT架构下&#xff…