逆序
为了能够调用函数,需要有一种公认的方式来传递参数。 如果程序是完全独立的二进制文件,编译器可以自由决定调用约定。 然而在现实中,会使用共享库(例如 libc)以便公共代码可以只存储一次并动态链接到需要它的程序,从而减少程序大小
十进位位值制记数法包括十进位和位值制两条原则,"十进"即满十进一;"位值"则是同一个数位在不同的位置上所表示的数值也就不同,如三位数"111",右边的"1"在个位上表示1个一,中间的"1"在十位上就表示1个十,左边的"1"在百位上则表示1个百。这样,就使极为困难的整数表示和演算变得如此简便易行,以至于人们往往忽略它对数学发展所起的关键作用。 十进制数转换为二进制数时,由于整数和小数的转换方法不同,所以先将十进制数的整数部分和小数部分分别转换后,再加以合并
整数部分:除2取余逆序排列 小数部分:乘2取整,顺序排列。 二进制转换为十进制: 按权相加法,即将二进制每位上的数乘以权,然后相加之和即是十进制数。 二进制转换为八进制: 取三合一法,即从二进制的小数点为分界点,向左(向右)每三位取成一位,接着将这三位二进制按权相加,得到的数就是一位八位二进制数,然后,按顺序进行排列,小数点的位置不变,得到的数字就是我们所求的八进制数
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 示例1: 输入一个链表,返回一个倒序的数组。这道题最先想到的肯定是使用一种数据结构来存储链表中的数据,再以倒叙输出到结果数组中去
按照Peter M. Fenwick的说法,正如所有的整数都可以表示成2的幂和,我们也可以把一串序列表示成一系列子序列的和。采用这个想法,我们可将一个前缀和划分成多个子序列的和,而划分的方法与数的2的幂和具有极其相似的方式。一方面,子序列的个数是其二进制表示中1的个数,另一方面,子序列代表的f[i]的个数也是2的幂
我们主要进行关心的就是双重for循环以及其中的交换操作,首先外层循环表示要进行比较的趟数,每一趟都会产生一个最大值或最小值,这也就是冒泡的由来,i的范围限定为i < arr.length - 1,为什么不是i < arr.length呢?由上图可知,当未排序的数组中只有一个元素时,不需要再进行比较了,这时整个数组已经是有序状态了。那么内层循环中,为什么 j 的限制条件 为j < arr.length - 1 - i呢?这个也比较好理解,首先第一次的时候,要把 j 的范围限制在j < arr.length - 1 -0,这样arr[j] > arr[j+1]这样的操作才不会出现数组越界,进行第二趟比较的时候,arr[length -1]位置的元素已经是最大的,不需要再进行比较,这时候就要写成j < arr.length - 1 - 1,总结起来就是j < arr.length - 1 - i 但是我们进一步探究,上面的代码是存在这样的弊端的:加入第二趟排序之后,数组就已经是有序状态了,那么后面的几趟比较是不是非常多余呢?下面介绍冒泡排序的改进 代码都是自己在IDE中实现的,直接全部贴过来了,虽然看起来很冗长,其实关键的核心代码就那么几行,我们来看具体的改进方法,采用的方法就是设置一个flag变量,在当前这一趟比较中,如果发生了元素的交换,那么将flag设置为true,如果这趟比较从头到尾都没有进行过交换,那么最终的flag值为false,直接break退出循环。 用我自己的话理解呢,这个改进就是在之前的单向寻找最大值的基础上,增加了反向寻找最小值,也就是双向冒泡,总体上来讲,鸡尾酒排序要比普通冒泡排序的交换次数要少,但是对于鸡尾酒排序,在算法的时间复杂度和空间复杂度上并没有改进,在完全逆序数组进行排序时,不管是普通的还是改进的,表现得都是非常差
研究生复试大纲《计算机程序设计》复试大纲-v2021 3.掌握算法的描述方法及一些常用算法的设计。 4.掌握程序调试的方法。 5.具有良好的阅读和调试程序的能力
我们主要进行关心的就是双重for循环以及其中的交换操作,首先外层循环表示要进行比较的趟数,每一趟都会产生一个最大值或最小值,这也就是冒泡的由来,i的范围限定为i < arr.length - 1,为什么不是i < arr.length呢?由上图可知,当未排序的数组中只有一个元素时,不需要再进行比较了,这时整个数组已经是有序状态了。那么内层循环中,为什么 j 的限制条件 为j < arr.length - 1 - i呢?这个也比较好理解,首先第一次的时候,要把 j 的范围限制在j < arr.length - 1 -0,这样arr[j] > arr[j+1]这样的操作才不会出现数组越界,进行第二趟比较的时候,arr[length -1]位置的元素已经是最大的,不需要再进行比较,这时候就要写成j < arr.length - 1 - 1,总结起来就是j < arr.length - 1 - i 但是我们进一步探究,上面的代码是存在这样的弊端的:加入第二趟排序之后,数组就已经是有序状态了,那么后面的几趟比较是不是非常多余呢?下面介绍冒泡排序的改进 代码都是自己在IDE中实现的,直接全部贴过来了,虽然看起来很冗长,其实关键的核心代码就那么几行,我们来看具体的改进方法,采用的方法就是设置一个flag变量,在当前这一趟比较中,如果发生了元素的交换,那么将flag设置为true,如果这趟比较从头到尾都没有进行过交换,那么最终的flag值为false,直接break退出循环。 用我自己的话理解呢,这个改进就是在之前的单向寻找最大值的基础上,增加了反向寻找最小值,也就是双向冒泡,总体上来讲,鸡尾酒排序要比普通冒泡排序的交换次数要少,但是对于鸡尾酒排序,在算法的时间复杂度和空间复杂度上并没有改进,在完全逆序数组进行排序时,不管是普通的还是改进的,表现得都是非常差
快速排序法的性能是什么? 答:我们来分析一下快速排序法的性能。 快速排序的时间性能取决于快速排序递归的深度,可以用递归树来描述递归算法的执行情况。 如图所示,它是 {50109030 7040806020}在快速排序过程中的递归过程
我们主要进行关心的就是双重for循环以及其中的交换操作,首先外层循环表示要进行比较的趟数,每一趟都会产生一个最大值或最小值,这也就是冒泡的由来,i的范围限定为i < arr.length - 1,为什么不是i < arr.length呢?由上图可知,当未排序的数组中只有一个元素时,不需要再进行比较了,这时整个数组已经是有序状态了。那么内层循环中,为什么 j 的限制条件 为j < arr.length - 1 - i呢?这个也比较好理解,首先第一次的时候,要把 j 的范围限制在j < arr.length - 1 -0,这样arr[j] > arr[j+1]这样的操作才不会出现数组越界,进行第二趟比较的时候,arr[length -1]位置的元素已经是最大的,不需要再进行比较,这时候就要写成j < arr.length - 1 - 1,总结起来就是j < arr.length - 1 - i 但是我们进一步探究,上面的代码是存在这样的弊端的:加入第二趟排序之后,数组就已经是有序状态了,那么后面的几趟比较是不是非常多余呢?下面介绍冒泡排序的改进 代码都是自己在IDE中实现的,直接全部贴过来了,虽然看起来很冗长,其实关键的核心代码就那么几行,我们来看具体的改进方法,采用的方法就是设置一个flag变量,在当前这一趟比较中,如果发生了元素的交换,那么将flag设置为true,如果这趟比较从头到尾都没有进行过交换,那么最终的flag值为false,直接break退出循环。 用我自己的话理解呢,这个改进就是在之前的单向寻找最大值的基础上,增加了反向寻找最小值,也就是双向冒泡,总体上来讲,鸡尾酒排序要比普通冒泡排序的交换次数要少,但是对于鸡尾酒排序,在算法的时间复杂度和空间复杂度上并没有改进,在完全逆序数组进行排序时,不管是普通的还是改进的,表现得都是非常差
