首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

剑指offer——年龄排序问题

题目:对某公司所有员工的年龄进行排序,要求时间复杂度为O(n) 分析:         在已有的排序算法中,性能最好的是快速排序,但是他在最好的情况下时间复杂度只能达到O(nlogn),无法满足本题的要求...但是我们可以从“年龄”这一特殊条件入手。         年龄具有显著的特征,那就是这些数值都分布在0-99之间。...由于待排序的数值均在0-99这个固定区间内,因此我们可以用一个长度为100的数组,记录0-99这100个年龄出现的次数。我们只需要扫描一遍所有员工的年龄,就能统计出这个数组。.../** * 对某公司所有员工的年龄进行排序,要求时间复杂度为O(n) * @author chibozhou * */ public class AgeSort { /** * 排序函数...* @param ages 存放公司全体人员年龄的数组 */ public static void ageSort(int[] ages){ //countAge的下标i代表年龄,countAge

81960
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    java冒泡排序代码_Java冒泡排序

    一、冒泡排序: 利用冒泡排序对数组进行排序 二、基本概念: 依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。...四、java代码实现: package 冒泡排序; import java.util.Arrays; /** * 冒泡排序 * @author chen * */ public class BubbleSort...六、算法优化: 冒泡排序法存在的不足及改进方法: 第一,在排序过程中,执行完最后的排序后,虽然数据已全部排序完备,但程序无法判断是否完成排序,为了解决这一不足,可设置一个标志位flag,将其初始值设置为非...在新一轮排序开始时,检查此标志,若此标志为0,表示上一次没有做过交换数据,则结束排序;否则进行排序; package 冒泡排序; import java.util.Arrays; /** * 冒泡排序改进版...由于局部冒泡排序和冒泡排序的数据移动次数总是相同的,而局部冒泡排序所需关键字的比较次数常少于冒泡排序,这意味着局部冒泡排序很可能在平均比较次数上对冒泡排序有所改进,当比较次数较少的优点不足以抵消其程序复杂度所带来的额外开销

    1.9K61

    java链表排序方法_java链表排序

    插入排序 对链表进行插入排序,是最简单的一种链表排序算法,用于插入排序是迭代的,所以每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。...每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。重复直到所有输入数据插入完为止。...对于归并排序排序在数组排序中的运用,详细请点击此处。...这里主要介绍归并排序在链表排序中的运用。...在使用归并排序算法进行链表排序时,其基本思想是将链表细分成一个个子链表,将子链表进行排序,然后再将相邻的两个有序子链表进行合并,得到更长的有序链表,最后一步步得到整个有序链表,子链表进行合并排序时需要用到合并两个有序链表算法

    98510

    快速排序Java实现_快速排序实现java

    高快省的排序算法 有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端呢。 假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数进行排序。...最终将会得到这样的序列,如下 1 2 3 4 5 6 7 8 9 10 到此,排序完全结束。...细心的同学可能已经发现,快速排序的每一轮处理其实就是将这一轮的基准数归位,直到所有的数都归位为止,排序就结束了。下面上个霸气的图来描述下整个算法的处理过程。 这是为什么呢?...快速排序之所比较快,因为相比冒泡排序,每次交换是跳跃式的。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。...因此快速排序的最差时间复杂度和冒泡排序是一样的都是O(N2),它的平均时间复杂度为O(NlogN)。其实快速排序是基于一种叫做“二分”的思想。我们后面还会遇到“二分”思想,到时候再聊。

    1.4K10

    java冒泡排序经典代码_java冒泡排序

    经典算法——冒泡排序(Bubble Sort) 一、示例代码(伸手党看这里) 1.示例一 importjava.util.Arrays;public classBubbleSort {public static...int temp; /*临时变量,交换数据时使用*/ int length =arr.length;for(int p = length-1; p > 0; p–){ /*需要进行N-1(数组长度减一)趟排序...*/ for(int i = 0; i arr[i+1]){//进行位置交换 temp =arr[i]; arr[i]= arr[i+1...在使用冒泡排序的时候有可能会遇到这样一种情况:某一趟排序从头到尾,数组中的数字都没有发生位置交换。 那么上面这种情况说明了什么呢?说明了在经过上一趟的排序后,整个数组就已经被排好序了。...这么说的话原来计划的N-1趟排序我们是不是可以不用跑满了?是的!

    76720

    2014年蓝桥杯Java C组——猜年龄

    2014年蓝桥杯Java C组——猜年龄 ---- 标题:猜年龄 小明带两个妹妹参加元宵灯会。别人问她们多大了,她们调皮地说:“ 我们俩的年龄之积是年龄之和的6倍”。...小明又补充说:“她们可不是双胞胎,年龄差肯定也不超过8岁啊。” 请你写出:小明的较小的妹妹的年龄。 注意:只写 一个人的年龄数字,请通过浏览器提交答案。不要书写任何多余的内容。...这里其实只要列出公式就能直接出结果了: 我们设妹妹的年龄为i,姐姐的年龄为j。...i - j| < 8 and i < j 由于只有一个等式:【i * j == 6 * (i + j)】,其余的两个都是不等式,那么,我们其实是无从下手的,数字简单我们可以看出来,既然小姑娘,那么年龄肯定是在...以下是输出结果: 由于我们要的是妹妹的年龄,故而输出10。姐姐的年龄是15岁,也就是j的值。

    35220

    java冒泡排序和快速排序

    下面我们来看看java中的Arrays.sort(int []a)方法是怎么实现的。 ---- 二、快速排序 java中Arrays.sort使用了两种排序方法,快速排序和优化的合并排序。...快速排序主要是对哪些基本类型数据(int,short,long等)排序, 而合并排序用于对对象类型进行排序。 使用不同类型的排序算法主要是由于快速排序是不稳定的,而合并排序是稳定的。...这里的稳定是指比较相等的数据在排序之后仍然按照排序之前的前后顺序排列。...1.实现原理 java1.7之后的版本,开始用双轴快排取代了以前的排序算法,现在只实现了8种基本数据类型性的双轴快排,对象的排序在1.7中还在用老式的,不过都标了过时,估计以后版本中就会被新的双轴快排取代了...尽管插入排序的时间复杂度为0(n^2),但是当数组元素较少时,插入排序优于快速排序,因为这时快速排序的递归操作影响性能。   2)较好的选择了划分元(基准元素)。

    1.3K30

    Java 冒泡排序

    - 1; i++) {// 外循环控制排序的趟数 for (int j = 0; j < list.length - i - 1; j++) {// 内循环控制每一趟排序多少次...,总共进行N-1趟排序,每i趟的排序次数为(N-i)次,所以可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数 (2)冒泡排序的优点:每进行一趟排序,就会少比较一次,因为每进行一趟排序都会找出一个较大值...(3)时间复杂度 1.如果我们的数据正序,只需要走一趟即可完成排序。所需的比较次数C和记录移动次数M均达到最小值,即:Cmin=n-1;Mmin=0;所以,冒泡排序最好的时间复杂度为O(n)。...2.如果很不幸我们的数据是反序的,则需要进行n-1趟排序。每趟排序要进行n-i次比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值: ?...image.png 综上所述:冒泡排序总的平均时间复杂度为:O(n2) ,时间复杂度和数据状况无关。

    59020

    Java—Sort排序

    Java中Sort排序是非常常用的方法,这一章我们主要来认识一下Sort的用法和相关的实现。...;//会检查数组个数大于286且连续性好就使用归并排序,若小于47使用插入排序,其余情况使用双轴快速排序 System.out.println("升序排序:"); for (int num : array...除了两节所描述的情况,我们还会遇到对于自定义类排序的情况,例如我们现在有一个学生对象,想要根据年龄对其进行排序,学生类Student如下: public class Student { private...,年龄为null时为小 StudentAsc studentWang = new StudentAsc("王小二", 10); StudentAsc studentZhang = new StudentAsc...,年龄为null时为最大 StudentDesc studentWang = new StudentDesc("王小二", 10); StudentDesc studentZhang = new StudentDesc

    76330

    排序Java

    排序:堆排序的思想比较难理解,首先将数据看成是一个二叉树,对数据进行二叉树的建立(建堆),这个过程也是排序的过程,将最小或最大的值排到根节点上,如果采用最大值,则称为最大堆,反之,称为最小堆 例如:...有一个数组为[8,1,4,2,3],将他变为二叉树为: 8 1 4 2 3 要对它进行排序,可以从8开始,和他的左孩子和右孩子比较,将小的那个和本身进行替换,第一次替换变为...那么调用我们代码后形成的树为: 2 1 4 3 8 最小值1,并没有到达根节点,这时转变思路,不用从根节点开始建立,而是从树的底部开始建立堆,过程为: 先将1,2,3进行排序...nums = new int[]{5, 7, 1, 3, 9, 0, 1, 6, 8, 4}; buildHeap(nums); 结果: 0 1 1 3 4 5 6 7 8 9 堆排序本身用来排序性能并不高...,但是作为查找的时候性能很高,由于二分查找只针对已经排好序的顺序表,对于大数据量的散列表,推排序就可以出场了,因为推排序的建堆过程,尽可能少的访问节点,减少了对一个节点的重复访问,而又具有二分的思想,相比于其他排序

    39620
    领券