之前我在javase基础中初步了解了一下冒泡排序,现在想根据创建的排序算法总结出它们在各方面的优劣性。

下图为java常见的几种排序:

之前我们在刘老师的数据结构课程上也有学过时间复杂度和空间复杂度的概念,时间复杂度用来描述一个算法的执行时间,空间复杂度则是是对一个算法在运行过程中临时占用存储空间大小的一个度量。

一、交换排序

1、冒泡排序

核心思想是:

1、从第一个元素开始,比较相邻的两个元素。如果第一个比第二个大,则进行交换。

3、轮到下一组相邻元素,执行同样的比较操作,再找下一组,直到没有相邻元素可比较为止,此时最后的元素应是最大的数。

4、除了每次排序得到的最后一个元素,对剩余元素重复以上步骤,直到没有任何一对元素需要比较为止。算法代码如下:

public void bubbleSortOpt(int[] arr) {if(arr == null) {throw new NullPoniterException();}if(arr.length < 2) {return;}int temp = 0;for(int i = 0; i < arr.length - 1; i++) {for(int j = 0; j < arr.length - i - 1; j++) {if(arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}

这段代码还有不足的地方,就是如果经过一轮交换之后,序列已经是是有序排列了,那么将不用执行剩下的交换。改进之后代码:

public static int bubbleSortOpt2(int[] arr) {if (arr == null) {throw new NullPointerException();} else if (arr.length < 2) {return 0;}int temp;int count = 0;for (int i = 0; i < arr.length - 1; i++) {int flag = 1;for (int j = 0; j < arr.length - 1 - i; j++) {if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;flag = 0;}count++;}// 没有发生交换,排序已经完成if (flag == 1) {return count;}}return count;
}

2、快速排序

快速排序的思想很简单,就是先把待排序的数组拆成左右两个区间,左边都比中间的基准数小,右边都比基准数大。接着左右两边各自再做同样的操作,完成后再拆分再继续,一直到各区间只有一个数为止。一般取首位元素作为基准数。

用java实现快速排序:

public void quicksort(int[] arr, int start, int end) {if(start < end) {// 把数组中的首位数字作为基准数int stard = arr[start];// 记录需要排序的下标int low = start;int high = end;// 循环找到比基准数大的数和比基准数小的数while(low < high) {// 右边的数字比基准数大while(low < high && arr[high] >= stard) {high--;}// 使用右边的数替换左边的数arr[low] = arr[high];// 左边的数字比基准数小while(low < high && arr[low] <= stard) {low++;}// 使用左边的数替换右边的数arr[high] = arr[low];}// 把标准值赋给下标重合的位置arr[low] = stard;// 处理所有小的数字quickSort(arr, start, low);// 处理所有大的数字quickSort(arr, low + 1, end);}
}

二、插入排序

插入排序是一种简单的排序方法,其基本思想是将一个记录插入到已经排好序的有序表中,使得被插入数的序列同样是有序的。按照此法对所有元素进行插入,直到整个序列排为有序的过程。

因为插入排序还没有仔细学,所以就不放代码了

1、直接插入排序

直接插入排序就是插入排序的粗暴实现。对于一个序列,选定一个下标,认为在这个下标之前的元素都是有序的。将下标所在的元素插入到其之前的序列中。接着再选取这个下标的后一个元素,继续重复操作。直到最后一个元素完成插入为止。我们一般从序列的第二个元素开始操作。

2、希尔排序

希尔排序把序列按下标的一定增量(步长)分组,对每组分别使用插入排序。随着增量(步长)减少,一直到一,算法结束,整个序列变为有序。因此希尔排序又称缩小增量排序。

一般来说,初次取序列的一半为增量,以后每次减半,直到增量为一。

三、选择排序

选择排序是一种简单直观的排序算法,首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

1、简单选择排序

选择排序思想的暴力实现,每一趟从未排序的区间找到一个最小元素,并放到第一位,直到全部区间有序为止。

java实现代码如下:

public static void selectSort(int[] arr) {// 遍历所有的数for (int i = 0; i < arr.length; i++) {int minIndex = i;// 把当前遍历的数和后面所有的数进行比较,并记录下最小的数的下标for (int j = i + 1; j < arr.length; j++) {if (arr[j] < arr[minIndex]) {// 记录最小的数的下标minIndex = j;}}// 如果最小的数和当前遍历的下标不一致,则交换if (i != minIndex) {int temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;}}
}

2、堆排序

我们需要把一个普通数组转换为大顶堆,调整的起始点是最后一个非叶子结点,然后从左至右,从下至上,继续调整其他非叶子结点,直到根结点为止。

步骤如下:

1)根据初始数组构造堆

2)每次交换第一个和最后一个元素,然后将除最后一个元素以外的其他元素重新调整为大顶堆

重复以上两个步骤,没有元素可操作,就完成排序了。

四、总结

因为暂时还没有学习到所以的排序方法,所以有些排序就没有写出来了。

快速排序是最快的的排序算法

各算法时间复杂度和空间复杂度比较如下:

Java中各个排序算法比较相关推荐

  1. android studio插入数据表中没有_学Java能拿高薪吗 Java中常见排序算法有哪些

    学Java能拿高薪吗?Java中常见排序算法有哪些?作为老牌编程语言,Java拥有广阔的市场占有率,几乎90%以上的大中型互联网应用系统在服务端开发都会首选Java.为了加入到Java这一高薪行业,很 ...

  2. java中的排序算法——归并排序

    为什么使用归并排序? java中的Arrays.sort(Object[] o)是对数组进行排序,它使用的是归并排序的方式,  快速排序要比归并排序更快一些,但为什么使用归并排序了?原因是归并排序是一 ...

  3. 6、java中的排序算法

    1.简介 排序是将元素按着指定关键字的大小递增或递减进行数据的排列,排序可以提高查找的效率 2.排序算法的分类 排序算法可大致分为四类七种,具体分类如下: 插入排序:直接插入排序.希尔排序 交换排序: ...

  4. java中的排序算法——插入排序详解

    package com.algorithm; /**  * 插入排序及其变体  *   * List可转化为数组进行排序  * Object数组中的元素必须实现Comparable接口,即元素必须是可 ...

  5. java中的排序算法——简单选择排序,树形选择排序与堆排序(一)

    package com.sort; /**  * 选择排序:  * 简单选择排序,树形选择排序与堆排序  *   */ public class SelecSortDemo { /** * ----- ...

  6. java中queue排序_Java中常见的排序算法有哪些?---选择排序

    排序相关的的基本概念 排序: 将一组杂乱无章的数据按一定的规律顺次排列起来. 数据表( data list): 它是待排序数据对象的有限集合. 排序码(key):通常数据对象有多个属性域, 即多个数据 ...

  7. java中自然排序和比较器排序

    这里所说到的Java中的排序并不是指插入排序.希尔排序.归并排序等具体的排序算法.而是指执行这些排序算法时,比较两个对象"大小"的比较操作.我们很容易理解整型的 i>j 这样 ...

  8. 排序算法 - 面试中的排序算法总结

    排序算法总结 查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中.因为其实现代码较短,应用较常见.所以在面试中经常会问到排序算法及其相关的问题.但万变不离其宗,只要熟悉了思想,灵活运用也不 ...

  9. java中的排序方法,Java中的排序比较方式:自然排序和比较器排序

    这里所说到的Java中的排序并不是指插入排序.希尔排序.归并排序等具体的排序算法.而是指执行这些排序算法时,比较两个对象"大小"的比较操作.我们很容易理解整型的 i>j 这样 ...

最新文章

  1. 戴着口罩如何进行人脸识别?快进来看看吧!
  2. ./configure 参数解析
  3. iptables redirect 劫持跳转引起 Go 服务故障
  4. C# 获得Excel工作簿Sheet页面(工作表)集合的名称
  5. 小D课堂 - 零基础入门SpringBoot2.X到实战_第三节SpringBoot热部署devtool和配置文件自动注入实战_16、注解配置文件自动映射到属性和实体类实战...
  6. [OrCad电路板设计系统].Orcad.Pspice.9.2下载安装
  7. 【VirtualBox打开出错】创建COM对象失败(XP3系统)
  8. 计算机视觉专业名词中英文对照
  9. 汇编(五):第一个汇编程序
  10. Android Studio设计用户登录界面
  11. 神经网络编程的34个案例,人工神经网络编程内容
  12. cnavas手绘图形库 : rough.js
  13. 简单分析大量京东快递揽收后没有物流的单号
  14. Centos7 kvm环境制作qcow2 格式镜像
  15. AI虚拟数字人直播带货软件 AI数字人直播间怎么搭建 搭建教程分享
  16. ECharts 示例——圆环图:数据标签详细设置
  17. Ansys Speos | 基于 Workbench 和 Speos 的准直全反射透镜优化设计案例
  18. 【解决方案】智慧工地AI视频远程集中监控解决方案是如何通过EasyCVR视频平台实现的?
  19. windows下安装pytorch报错InvalidArchiveError(‘Error with archive D:\\anaconda\\pkgs\\pytorch-1.2.0
  20. 玖乐解密垃圾某山代刷网废话不多自行看就行了可二开可运营

热门文章

  1. linux内核的一些知识点(上)
  2. jetbrains Rider使用
  3. 一、领域驱动设计核心思想与设计过程
  4. html表白earth,表白很感动的英语句子
  5. 导入HttpPost包
  6. 如何挑选考研政治的复习资料
  7. PHP 将英文状态的双引号替换成中文状态的双引号
  8. 高级项目管理师个人总结--项目控制
  9. 原生js实现form表单提交
  10. img的onerror事件