zoukankan      html  css  js  c++  java
  • java【排序】面试题

    排序

    选择排序
    基本思想
    每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
    简单理解:每个元素都和它后面的元素比较,只要后面的元素比它大就交换
    选择排序的最终代码
    以上4个for循环代码重复性较高,唯独不一样的地方就是每个for循环中都有一个使用多次的固定数字,第一个for的数
    字0,第二个for的数字是1,第3个for的数字是2,第4个for的数字是3,这样可以写一个循环4次的for循环,假设循环循环
    变量为就,只要j的取值>=0开始到<4结束,正好能获取0,1,2,3的数字,然后把上面的任意一个for循环作为循环体,把其
    中的使用多次的固定数字用j替换掉即可.
    发现5个数只需要排4趟,那么n个数需要排n-1趟,如果上面的循环中的变量j的范围固定写成<4,对于有6,7,...个数字的
    数组排序是不同用的,所以4可以使用数组的长度array.length-1 = 5-1 来表示
     

    排序前的内容:[3, 4, 5, 6, 7] 
    排序后的内容:[7, 6, 5, 4, 3]
    总结
      1.选择排序的原理:每个元素都和它后面的元素比较,只要后面的元素比它大就交换,掌握了这个原理,选择排序非常简单
      2.通过画图分析,5个数字排4趟,n数字排n-1趟,而外层的for循环代表的是循环的趟数,所以外层循环的结束条件是array.length-1,但是写array.length代码也没有问题,比如5个数字在第4趟都已经排好了,再进行第5趟排序,也不会影响程序的结果.外层循环的变量的初始值要从0开始,因为选择排序的原理就是每个元素和它后面的所有元素比较,既然要获取所有元素,那索引必须从0开始.
      3.内层循环变量的初始值写成int i = j+1是为了减少比较的次数,提高效率,其实写成int i = 0,也不会影响程序运行的结果,只是多比较了很多次.但是内层循环的结束条件i<array.length,这里一定不能-1,原因很简单,因为每个元素要和它后面的所有元素比较,既然是所有元素,那就必须能取到最后一个元素,如果写成i<array.length-1,意味着只能取到array.length-2(是数组的倒数第二个元素,而不是最后一个元素),这样排序结果会出现问题.
    冒泡排序
    基本思想
    核心思想是从头开始让相邻的两个元素进行比较,符合条件就交换位置,这样就把最大值或者最小值放到数组的最后面了;接着再从头开始两两比较交换,直到把最大值或者最小值放到数组的倒数第二位。(即不需要与最后一位数进行对比).....以此类推,直到排序完成。
    简单理解: 每次都从第一个元素开始(索引0),向后两两比较,只要后面的比前面的大,就交换(从大到小)
    冒泡排序的最终代码
    以上4个for循环代码重复性较高,唯独不一样的地方就是每个for循环结束条件最后减的数字不同,第一个for循环结束条件减的数字是0,第二个for循环结束条件减的数字是1,第3个for循环结束条件减的数字是2,第4个for循环结束条件减的数字是3,这样可以写一个循环4次的for循环,假设循环变量为j,只要j的取值>=0开始到<4结束,正好能获取0,1,2,3的数字,然后把上面的任意一个for循环作为循环体,把该循环体中for循环的结束条件中最后减掉的数字用j替换掉即可.发现5个数只需要排4趟,那么n个数需要排n-1趟,如果上面的循环中的变量j的范围固定写成<4,对于有6,7,...个数字的数组排序是不通用的,所以4可以使用数组的长度array.length-1 = 5-1 来表示
     

    排序前的内容:[3, 4, 5, 6, 7] 
    排序后的内容:[7, 6, 5, 4, 3]
      1.冒泡排序的原理:每次都从第一个元素开始(索引0),向后两两比较,只要后面的比前面的大,就交换(从大到小)
      2.通过画图分析,5个数字排4趟,n数字排n-1趟,而外层的for循环代表的是循环的趟数,所以外层循环的结束条件是array.length-1,但是写array.length代码也没有问题,比如5个数字在第4趟都已经排好了,再进行第5趟排序,也不会影响程序的结果.
      3.内层循环变量的初始值写成int i =0,是为了保证每次都从第一个元素开始(索引为0)向后两两比较.但是内层循环的结束条件i<array.length-1-i,这里一定要-1,原因很简单,因为在内层循环中分表使用i和i+1作为索引获取数组的元素,就要保证i和i+1都不能超出数组的索引范围,即i<array.length && i+1<array.length 推导出i<array.length-1.最后的-i只是为了提高效率,因为每趟排序都会确定一个数组元素的位置,下一趟排序的时候,已经确定好位置的元素是不用继续排序的.
  • 相关阅读:
    将博客搬至CSDN
    神州笔记本电脑【K670D】安装 Ubuntu18.04 系列操作
    ValueError: Unknown label type: 'continuous'
    Spark: JAVA_HOME is not set
    IDEA 搭建 Spark 源码 (Ubuntu)
    XX-Net 解决IPV6 不稳定,时好时坏。
    解决SBT下载慢,dump project structure from sbt?
    pip install kaggle 出现 【网络不可达】?
    Git clone 克隆Github上的仓库,速度慢?
    进程间的通信方式
  • 原文地址:https://www.cnblogs.com/qingmuchuanqi48/p/13835785.html
Copyright © 2011-2022 走看看