指针数组

常用算法(冒泡、插入、选择、快速)和二叉树详解

浪子不回头ぞ 提交于 2020-04-08 13:59:31
  同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。   计算机科学中,算法的 时间复杂度 是一个函数,它定量描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号(Order)表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,它考察当输入值大小趋近无穷时的情况。 定义   在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。 算法复杂度   算法复杂度分为时间复杂度和空间复杂度。其作用: 时间复杂度是指执行算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。(算法的复杂性体现在运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间和空间(即寄存器)资源,因此复杂度分为时间和空间复杂度)。 时间复杂度   1. 一般情况下,算法的基本操作重复执行的次数是模块n的某一个函数f(n),因此,算法的时间复杂度记做:T(n)=O(f(n)) 分析:随着模块n的增大,算法执行的时间的增长率和 f(n) 的增长率成正比,所以 f(n) 越小,算法的时间复杂度越低,算法的效率越高。   2.

C语言编程优化运行速度

混江龙づ霸主 提交于 2020-04-06 04:02:18
1、选择合适的算法和数据结构 选择一种合适的数据结构很重要,如果在一堆随机存放的数中使用了大量的插入和删除指令,那使用链表要快得多。数组与指针语句具有十分密切的关系,一般来说,指针比较灵活简洁,而数组则比较直观,容易理解。对于大部分的编译器,使用指针比使用数组生成的代码更短,执行效率更高。 在许多种情况下,可以用指针运算代替数组索引,这样做常常能产生又快又短的代码。与数组索引相比,指针一般能使代码速度更快,占用空间更少。使用多维数组时差异更明显。下面的代码作用是相同的,但是效率不一样。 数组索引 指针运算 For(;;){ p=array A=array[t++]; for(;;){ a=*(p++); 。。。。。。。。。 。。。。。。 } } 指针方法的优点是, array 的地址每次装入地址 p 后,在每次循环中只需对 p 增量操作。在数组索引方法中,每次循环中都必须根据 t 值求数组下标的复杂运算。 2、使用尽量小的数据类型 能够使用字符型 (char) 定义的变量,就不要使用整型 (int) 变量来定义;能够使用整型变量定义的变量就不要用长整型 (long int) ,能不使用浮点型 (float) 变量就不要使用浮点型变量。当然,在定义变量后不要超过变量的作用范围,如果超过变量的范围赋值, C 编译器并不报错,但程序运行结果却错了,而且这样的错误很难发现。 在

四种排序算法

▼魔方 西西 提交于 2020-04-06 03:57:24
前言:经过昨天做的排序算法题,发现自己这么简单的题都忘记怎么做了,感觉很难受,今天复习整理了一遍,写成一个文章,以便日后复习,其中冒泡、选择、插入三种算法的思路和图片来自于B站up主"正月点灯笼",感谢你的讲解,我觉得你讲的非常好! 冒泡排序 例如 3、7、4、2、6、1这一个数组,我们对它进行升序的一个排序 1、首先从左往右两两进行比较,若左>右,则交换位置,进行第一趟排序 对于这第一趟的排序,并不能保证从左往右一定都是正确的升序排序,但是一定能保证最大的数已经排在了最右边 由此,我们可以得到一个思路,在第一趟排序后,我们只需要对这个长度为6的数组左边5个数字再进行一次冒泡排序,然后再对左边4个数字再进行一次冒泡排序,以此类推..... #include <stdio.h> /* 冒泡排序算法 */ /*** * @Description:交换函数,交换括号内的参数 * [@Param](https://my.oschina.net/u/2303379): &a,&b * [@return](https://my.oschina.net/u/556800): * [@Author](https://my.oschina.net/arthor): JaneRoad * [@Date](https://my.oschina.net/u/2504391): 2020/4/1 */

c语言中的代码优化《转》

痴心易碎 提交于 2020-04-06 03:03:44
在性能优化方面永远注意80-20原则,即20%的程序消耗了80%的运行时间,因而我们要改进效率,最主要是考虑改进那20%的代码。不要优化程序中开销不大的那80%,这是劳而无功的。 第一招:以空间换时间   计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题,我们就有了解决问题的第1招--以空间换时间。比如说字符串的赋值: 方法A:通常的办法 #define LEN 32 char string1 [LEN]; memset (string1,0,LEN); strcpy (string1,"This is a example!!"); 方法B: const char string2[LEN] ="This is a example!"; char * cp; cp = string2 使用的时候可以直接用指针来操作。 从上面的例子可以看出,A和B的效率是不能比的。在同样的存储空间下,B直接使用指针就可以操作了,而A需要调用两个字符函数才能完成。B的缺点在于灵活 性没有A好。在需要频繁更改一个字符串内容的时候,A具有更好的灵活性;如果采用方法B,则需要预存许多字符串,虽然占用了大量的内存,但是获得了程序执 行的高效率。 如果系统的实时性要求很高,内存还有一些,那我推荐你使用该招数。 第二招: 使用宏而不是函数。   这也是第一招的变招

指针运算(C++)

一世执手 提交于 2020-04-06 00:31:34
//本文是学习《C++程序设计教程--设计思想与实现》的笔记。 1、指针可以进行加减运算。 数组名本身,没有方括号和下标,实际上是一个地址,表示数组起始地址。 整型数组的数组名本事得到一整数地址,字符数组的数组名得到一字符地址。 可以把数组起始地址赋值给一指针,通过移动指针(加减指针)来对数组元素进行操作。 例如:下面程序用指针运算来计算数组元素的和: #include<iostream.h> int main(){ int iArray[10]; int sum = 0; int * iPtr = iArray;//用数组名 iArray给指针初始化 //int *iPtr; //iPtr = iArray;这两句和上面一句是相等的//iPtr = &iArray[0];这句与左边那句相同 for(int i = 0;i < 10;i++){ iArray[i] = i * 2; cout<<"*iArray["<<i<<"]"<<"is "<<iArray[i]<<endl; } for(int idex = 0; idex < 10; idex++){ sum += *iPtr; cout<<"*iPtr is "<<*iPtr<<endl; iPtr++; } cout<<"sum is"<<sum<<endl; } sum += *iPtr; iPtr++; 等同于

Golang数组指针和指针数组

♀尐吖头ヾ 提交于 2020-04-04 22:49:49
数组很简单,有PHP基础一看就会,和PHP数组大不一样,不同的就是只有数字索引key,并且要指定类型 声明和初始化示例: package main import "fmt" func main() { // 声明 var arr1 [5]int arr1 = [5]int{1,2,3,4,5} // 声明并初始化 var arr2 [5]int = [5]int{1,2,3,4,5} // 直接初始化,只能在函数里 arr3 := [5]int{1,2,3,4,5} fmt.Println(arr1, arr2, arr3) } 数组循环,主要是for 和 for range 具体网上搜索一些会有很多教程,本文就不详细说,现在来点难的: 数组指针和指针数组: package main import "fmt" // 声明整形数组指针类型,表示该类型变量里存储的是一个数组的首地址 type arrPoint *[6]int func main() { // 声明并初始化数组,大小为6个元素整形数组,前5个数字是0,最后一个2 var a = [6]int{5: 2} var a1 = [6]int{5: 3} // 数组指针,变量的内容是数组的地址 var b arrPoint = &a var b1 arrPoint = &a1 // 指针数组,大小为2元素类型为arrPiont

《php和mysql web开发》读书笔记

有些话、适合烂在心里 提交于 2020-04-04 04:09:10
总算是强迫自己把第一篇给看完了,在这里做一个小结,将一些知识点记录下来。 一、第一篇 使用PHP 1.php中的注释。php支持c、c++和shell脚本风格注释  /**/多行注释 //单行注释 # 单行注释 2.date()函数。  date("H:i:s");  //15:24:23 date("ymd");  //20130707 3.使用$_POST['username'] $_GET'['username']来得到表单内容,取决于提交表单时使用的方法是post 还是get。无论使用什么方式,都可以使用$_REQUEST['username']来得到表单内容。 4.标识符是变量名称的名称,标识符可以是任何长度。由字母、数字、下划线组成。不能以数字开始。标志符区分大小写,但是函数名称是个例外,函数名不区分大小写。php的特性之一就是它不要求在使用变量之前声明变量。 5.php中的8种数据类型,6种常用,2种不常用。  Integer(整数)  用来表示整数  Float(浮点数,也叫Double,双精度值)  用来表示所有实数  String(字符串)  用来表示字符串  Boolean(布尔值)  用来表示true 或false  Array(数组)    用来保存具有相同类型的多个数据项。  Object(对象)   用来保存类的实例 还有两个特殊的类型:NULL(空

1.7 c之 指针

心已入冬 提交于 2020-04-03 23:28:34
指针 *P代表指针变量P所指的那个变量,也就是变量a。 为什么需要指针? 指针存在的目的就是间接访问。有了指针之后,我们访问变量a不必只通过a这个变量名来访问。而可以通过p = &a; *p = xxx这样的方式来间接访问变量a。 两个重要的运算符: &和* 指针的定和初始化 指针既然是一种变量,那么肯定也可以定义和初始化 第一种:先定义再赋值 int p; //定义指针变量p p = &a; //给p赋值 第二种:定义的同时初始化 int p = &a; //效果等同于上面的两句 使用指针的时候,*P则代表指针变量P所指向的那个变量。 int a = 23; int *p; P=&a; p = 111; 这里相当于a = 111 printf(“a = %d.\n”,a) :指针符号。指针符号在指针定义和指针操作的时候,解析方法是不同的。 int P; 定义指针变量p,这里 p含义不是代表指针变量P所指向的那个指针变量,在定义时这里的 含义告诉编译器P是一个指针。 使用指针的时候, p则代表指针变量p所指向的那个变量。 指针全程是指针变量,其实质就是c语言的一种变量。这种变量比较特殊,通常他的值会被赋值为某个变量的地址值( P = &a ),然后我们可以使用*p这样的方式间接访问p所指向的那个变量。 指针变量本质上是一个变量, 指针变量的类型属于指针类型 指针与数组的初次结合

2、指针的算术运算

筅森魡賤 提交于 2020-04-01 03:18:51
指针可以加上或减去一个整数。 指针的这种运算的意义和通常的数值的加减 运算的意义是不一样的 ,以单元为单位。 例如: 例二: char a[20]; int *ptr=(int *)a; // 强制类型转换并不会改变 a 的类型 ptr++; 在上例中,指针 ptr 的类型是 int*, 它指向的类型是 int ,它被初始化 为指向整型变量 a 。接下来的第 3 句中, 指针 ptr 被加了 1 ,编译器是这样 处理的:它把指针 ptr 的值加上了 sizeof(int) ,在 32 位程序中,是被加上 了 4 ,因为在 32 位程序中, int 占 4 个字节。 由于地址是用字节做单位的, 故 ptr 所指向的地址由原来的变量 a 的地址向高地址方向增加了 4 个字节。 由于 char 类型的长度是一个字节,所以,原来 ptr 是指向数组 a 的第 0 号 单元开始的四个字节,此时指向了数组 a 中从第 4 号单元开始的四个字节。 我们可以用一个指针和一个循环来遍历一个数组,看例子: 例三: int array[20]={0}; int *ptr=array; for(i=0;i<20;i++) { (*ptr)++; ptr++ ; } 这个例子将整型数组中各个单元的值加 1 。由于每次循环都将指针 ptr 加 1 个单元 ,所以每次循环都能访问数组的下一个单元。 再看例子:

C 指针精要

∥☆過路亽.° 提交于 2020-03-31 13:29:15
C 指针精要 http://blog.csdn.net/lwbeyond/article/details/6180640 一. 解读复杂指针声明 要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其优先级和运算优先级一样. 记住原则: 从变量名处起,根据运算符优先级结合,一步一步分析. int p; /* 这是一个普通的整型变量 */ int *p; /* 首先从P 处开始,先与*结合,所以说明P 是一个指针, 然后再与int 结合,说明指针所指向的内容的类型为int 型. 所以P 是一个返回整型数据的指针 */ int p[3]; /* 首先从P 处开始,先与[]结合,说明P 是一个数组, 然后与int 结合,说明数组里的元素是整型的. 所以P 是一个由整型数据组成的数组 */ int *p[3]; /* 首先从P 处开始,先与[]结合,因为其优先级比*高,所以P 是一个数组, 然后再与*结合,说明数组里的元素是指针类型, 然后再与int 结合,说明指针所指向的内容的类型是整型的 所以P 是一个由返回整型数据的指针所组成的数组 */ int (*p)[3]; /* 首先从P 处开始,先与*结合,说明P 是一个指针 然后再与[]结合,说明指针所指向的内容是一个数组 然后再与int 结合,说明数组里的元素是整型的. 所以P