排序算法汇总

参考书籍–《啊哈!算法》 作者:啊哈磊

首先提出一个问题:班内有5名同学,成绩分别为5,8,2,4,2分(满分10分),需要将成绩从小到大排序

简化版 桶排序
时间复杂度O(N)

import java.util.Scanner;public class Bucket_sort {public static void main(String[] args) {Scanner input = new Scanner(System.in);int n = input.nextInt();/*** 需要进行排序的数字范围在 0-5之间* */int[] a = new int[6];/*** 注意并非将数据存起来,而是在对应的“桶”内计数,最后统计出现次数* */for (int i = 0; i < n; i++) {int k = input.nextInt();a[k]++;}/*** 打印 内循环控制重复数据要重复读取* */for (int i = 0; i < 6; i++) {for (int j = 0; j < a[i] ; j++) {System.out.println(i);}}}
}

存疑一:这样成绩是按顺序存起来了,但是如果现在的情况是Lili 5分,Tony 8分,Joy 2分,Peter 3分,Ben 2分。如何在保证姓名和成绩对应的情况下排序呢??
另一方面,桶排序需要用到的“桶”的个数跟数据的最大值有关系,这里满分为10分只需要10个桶,但是如果数据量较少,但是数据的值较大的时候则会浪费大量空间。

冒泡排序算法
时间复杂度O(n^2)

import java.util.Scanner;public class Bubble_sort {public static void main(String[] args) {Scanner input = new Scanner(System.in);int[] a = new int[100];int n  =input.nextInt();/*** 输入n个数* */for (int i = 0; i < n; i++) {a[i] = input.nextInt();}/*** 冒泡排序核心算法* */for (int i = 0; i < n-1; i++) {for (int j = i+1; j < n; j++) {if (a[i] > a[j]) {int temp = a[i];a[i] = a[j];a[j] = temp;}}}/*** 打印* */for (int i = 0; i < n; i++) {System.out.print(a[i] + " ");}}
}

上面的冒泡排序为基本的算法,若想解决存疑一,只需要稍加变通即可实现

存疑二:冒泡排序解决了桶排序浪费空间的难题,但是这种排序算法采用双重循环,时间复杂度为指数级别,效率实在是不够好,有没有可以更快捷的方法呢?

快速排序
时间复杂度O(N·logN)

import java.util.Scanner;public class Fast_sort {static int n;static int[] a;public static void main(String[] args) {Scanner input = new Scanner(System.in);n = input.nextInt();a = new int[n];for (int i = 0; i < n; i++) {a[i] = input.nextInt();}fastsort(0, n-1);/*** 打印* */for (int i = 0; i < n; i++) {System.out.print(a[i] + " ");}}public static void fastsort(int left, int right) {if (left > right) {return;}int temp = a[left];int i = left;int j = right;/*** i == j 的时候为“一趟”结束的时候* */while (i != j) {/*** 顺序一定要从j开始,* a[j]如果不小于temp则前进,a[i]如果不大于temp则前进** */while (a[j] >= temp && i < j) {j--;}while (a[i] <= temp && i < j) {i++;}/*** 前进过程出现跳出while循环,则需要进行交换* */if (i < j) {int t = a[i];a[i] = a[j];a[j] = t;}}/*** 基准归位* */a[left] = a[i];a[i] = temp;/*** 处理左侧* */fastsort(left, i-1);/*** 处理右侧* */fastsort(i+1, right);}
}

通过快速排序就可以很好的解决存疑二中没有解决的问题了,这种排序算法在时间和空间上都得到了一个很好的利用。

再来一个问题:给出一串数字,这些数字没有顺序,而且还有许多重复的,我们需要完成排序和去重两个步骤
那么问题可以通过两种方法解决
1)先去重,后排序
解决思路:利用桶排序,在往“桶”中添加的时候,不采用a[i]++;,而是a[i] = 1;这样即使是重复的也不会多次计数了。
2)先排序,后去重
解决思路:可以利用冒泡和快排,由于排序完的序列,重复值都会在一个区间内,这样在输出的时候加个if判断即可实现。

存疑三:若是数据值十分巨大,该如何选择算法?
若数据量十分庞大,又该如何选择算法?

显然,对于数据值较大的题目,桶排序并不适合
而对于数据量较多的题目,冒泡排序要运行相当长的时间。所以快速排序真的是一个有效、方便的算法呢!!!

排序算法(一)--桶排序、冒泡、快排(JAVA)相关推荐

  1. 排序算法:桶排序、计数排序、基数排序

    相关博客: 排序算法:冒泡排序.插入排序.选择排序.希尔排序 排序算法:归并排序.快速排序 排序算法:桶排序.计数排序.基数排序 排序算法:堆排序 十大排序算法小结 这篇博客将主要介绍三种时间复杂度是 ...

  2. 排序算法之--桶排序(桶,像桶一样的排序,听起来很有趣哦0。0)

    排序算法之--桶排序 桶排序的工作的原理是将数组分到有限数量的桶子里,而这个有限数量是指多少个呢? 不急,容我细细道来:我们可以先求出这个数组的最大值和最小值,那么桶的数量就是max-min+1咯 为 ...

  3. 【排序算法】——图解双轴快排(建议收藏)

    原创公众号:「bigsai」,转载需注明出处 关注回复bigsai领取Java进阶pdf,回复进群加入力扣打卡群(目前200+). 觉得不错还请一键三连! 前言 在排序算法中,快排是占比非常多的一环, ...

  4. c语言桶排序,排序算法之——桶排序

    这是本人的第一篇随笔,为的是分享学习经验,和大家讨论一些算法,以便取得些许进步,也是对学习的总结. 话不多说,下面我会用图文的方式向各位介绍桶排序. 1.主要思想: 桶排序的大体思路就是先将数组分到有 ...

  5. 常用排序算法(八)桶排序

    桶排序 概要 本章介绍排序算法中的桶排序.内容包括: 1. 桶排序介绍 2. 桶排序图文说明 3. 桶排序实现 3.1  桶排序C实现 3.2  桶排序C++实现 3.3  桶排序Java实现 转载请 ...

  6. 排序算法_桶排序(箱排序)

    一.算法描述 假设有一组长度为N的待排关键字序列K[1....n]. 首先将这个序列划分成M个的子区间(桶). 然后基于某种映射函数 ,将待排序列的关键字k映射到第i个桶中(即桶数组B的下标 i) , ...

  7. 排序算法(7)----桶排序

    桶排序:  * 计数排序适合小范围的大量重复元素,而桶排序适合区间内尽可能随机的元素  * 它的思想是: * 把数据存在的区间划分为小的区间,就像桶一样,这些在一个桶中的数据在桶内排好序,再合并成排序 ...

  8. 经典白话算法之桶排序

    最快最简单的排序--桶排序 在我们生活的这个世界中到处都是被排序过的.站队的时候会按照身高排序,考试的名次需要按照分数排序,网上购物的时候会按照价格排序,电子邮箱中的邮件按照时间排序--总之很多东西都 ...

  9. java 桶排序_[图解] 桶排序

    桶排序是一种排序的思想,其实现包括计数排序和基数排序两种,冒泡排序.选择排序.插入排序.归并排序.快速排序和堆排序都是基于比较的排序,而桶排序提出了一种新的思路,即基于数据状态的排序. 1. 桶排序的 ...

  10. 函数c语言桶排算法,C语言基本排序算法之桶式排序实例

    本文实例讲述了C语言基本排序算法之桶式排序.分享给大家供大家参考,具体如下: 桶式排序是对一个有n个整型元素的数组a[n],其中对任意i,0 <= a[i] <= m的特殊排序算法. 可以 ...

最新文章

  1. windows如何实现视屏自动定时、全屏、轮播 播放
  2. 15年第六届蓝桥杯第九题_(矩阵快速幂优化的动态规划)
  3. 160个Crackme033
  4. 闪灯什么意思_开车闪一下闪二下闪三下大灯是什么意思
  5. XML Parsing in a Producer-Consumer Model
  6. Java设计模式----策略模式(Strategy)
  7. ECMAScript 6网页样式修正器
  8. SpringBoot 自定义线程池
  9. spring+springmvc+hibernate 整合
  10. idea右键单击没有 svn选项处理办法
  11. springboot+easyui+jpa实现动态权限角色的后台管理系统(二)
  12. 软件测试的错误优先级,软件测试典型错误
  13. gsonformat java代码_插件GsonFormat快速實現JavaBean
  14. android holder 一定要内部类吗,Android ViewHolder
  15. 【转】刨根究底字符编码之六——简体汉字编码中区位码、国标码、机内码、外码、字形码的区别及关系
  16. 计算机 北航 在线作业,北航计算机组成原理在线作业
  17. linux配置rsync排除某些目录,10个linux rsync命令排除文件/目录
  18. Excel在单元格内如何换行
  19. Unity教程:URP渲染管线实战教程系列【1】
  20. 9.将列表[mo,deng,ge]和[1,2,3] 转换成[(mo,1),(deng,2),(ge,3)]

热门文章

  1. 重构碎片化知识_荐书|《重构:数字化转型的逻辑》
  2. 完善三个数字对象排序程序。MOOC,Java第四章 面向对象和类 第一次作业
  3. android无法自动旋屏,Android 手动设置屏幕方向后不能自动转屏问题
  4. 首款搭载鸿蒙os的设备,华为发布会配件汇总,首款搭载 鸿蒙OS 的设备来了
  5. java canvas 画图片_canvas画布——画八卦图
  6. 素描java字母_进行Java基本GUI设计需要用到的包是
  7. 没有bug队——加贝——Python 练习实例 31,32
  8. 2寸的照片长宽各是多少_贵州公务员考试照片尺寸要求是多少
  9. mysql查询今天_昨天_7天_近30天_本月_上一月 数据_(转载)mysql查询今天、昨天、7天、近30天、本月、上一月数据...
  10. 多个服务器数据互通_5月23日部分服务器数据互通公告!