面试笔试准备(2)排序算法
来源:互联网 发布:cms管理系统开源java 编辑:程序博客网 时间:2024/05/21 14:52
本篇内容为牛客网,左程云算法课程课堂笔记。
(1)对冒泡排序的理解
首先要记住的是,冒泡排序每次让一个元素到他最终该待的地方去。
过程是,第一次的时候是前n个元素,从头到尾,第一个元素和第二个元素,相比较,大的那个数后移,直到第n个元素,没有元素可以和他相互比较,则开始下一趟。下一趟是,前n-1个元素进行比较,直到第n-1个元素,则停止,该元素放在n-1的位置上。
冒泡排序的时间发杂度为:O(n^2),但算法可以改进,使最佳情况时为O(n)。
基础代码为:
public int[] bubbleSort(int[] A, int n) { for (int i = 0; i < A.length; i++) {for (int j = 0; j < A.length-1-i; j++) {if (A[j]>A[j+1]) {int tmp=A[j];A[j]=A[j+1];A[j+1]=tmp;}}}return A; }
冒泡排序的改进:
第一步的改进:冒泡排序,如果在比较的过程中,某一次没有发生过交换,说明已经是有序的了,那么久不需要再进行比较,直接跳出就行了。
public int[] bubbleSort(int[] A, int n) { //实现冒泡排序for (int i = 0; i < A.length; i++) {boolean flag=false;for (int j = 0; j < A.length-1-i; j++) {if (A[j]>A[j+1]) {int tmp=A[j];A[j]=A[j+1];A[j+1]=tmp;flag=true;//如果某一次发生了交换。则说明还没有最终有序,因此,置为true;}}if (!flag) {break;}}return A; }
这次改进,就只填了一个标志位。使用标志位来判断是否需要进行后面的循环。这种根据新进的值来改变标志位的做法,在很多地方都是可用的:比如,判断一个序列是否是降序序列,可以设初始值为true,如果,在当前为止之前,都是升序。则为true,如果一旦发现了,降序,则flage就会变为flase.然后可以根据这个变化,来相应的设置一些值,来监督数列的变化过程。
(3)
//实现冒泡排序int lastpos=0;//表示上一次排序时,在lastpos之前的元素已经有序。int lastpostmp=0;//跟踪记录,新的一次遍历中,有序的位置。for (int i = 0; i < A.length; i++) {lastpos=lastpostmp;for (int j = 0; j < A.length-1-i; j++) {if (A[j]>A[j+1]) {int tmp=A[j];A[j]=A[j+1];A[j+1]=tmp;lastpostmp=j;}}if (lastpos==lastpostmp) {//说明下一次,没有再发生过交换,这之前的位置都基本有序了。break;}}return A;若记录序列的初始状态为"正序",则冒泡排序过程只需进行一趟排序,在排序过程中只需进行n-1次比较,且不移动记录;反之,若记录序列的初始状态为"逆序",则需进行n(n-1)/2次比较和记录移动。因此冒泡排序总的时间复杂度为O(n*n)。
阅读全文
0 0
- 面试笔试准备(2)排序算法
- 面试笔试准备(3)选择算法
- 面试准备之排序算法
- 找工作--笔试面试--准备2
- 面试笔试准备(1)
- 面试准备---排序算法--冒泡排序
- 算法笔试面试高频题之二-(排序算法)
- 准备面试笔试
- 笔试面试排序算法大总结(干货)
- 面试准备(算法编程)
- 笔试面试中常见的排序算法
- 面试/笔试数据结构之排序算法篇
- 笔试面试常考排序算法总结
- 面试/笔试数据结构之排序算法篇
- IT笔试面试知识准备
- cs找工作 笔试面试准备
- C++基础知识面试笔试准备
- 找工作--笔试面试--准备1
- 粒子群算法
- 小白笔记------------------------关于系统盘莫名其妙只剩几十兆或者几百兆
- Jmeter分布式测试
- android apk无法覆盖安装解决
- java获取IP地址
- 面试笔试准备(2)排序算法
- shell中的重定向 1>&2 2>&1 >&2
- gitlab搭建
- Spring事务管理失效的原因
- PI新建一张表之ID篇章
- 无意间发现的的搜索的特效
- ubuntu将openjdk7升级到openjdk8
- 简单的贪吃蛇游戏实现
- 一些算法的应用