TCPL知识点总结(三)

坚持阅读经典代码,以下是《The C programming language》中的经典例子,每次读来都觉经典,遂摘录下来,此文为第三讲,后面讲陆续更新。

1 折半查找

   /* binsearch:  find x in v[0] <= v[1] <= ... <= v[n-1] */
   int binsearch(int x, int v[], int n)
   {
       int low, high, mid;
       low = 0;
       high = n - 1;
       while (low <= high) {
           mid = (low+high)/2;
           if (x < v[mid])
               high = mid + 1;
           else if (x  > v[mid])
               low = mid + 1;
           else    /* found match */
               return mid;
       }
       return -1;   /* no match */
   }

2 将字符串转化为对应数值

   #include <ctype.h>
   /* atoi:  convert s to integer; version 2 */
   int atoi(char s[])
   {
       int i, n, sign;
       for (i = 0; isspace(s[i]); i++)  /* skip white space */
           ;
       sign = (s[i] == '-') ? -1 : 1;
       if (s[i] == '+' || s[i] == '-')  /* skip sign */
           i++;
       for (n = 0; isdigit(s[i]); i++)
           n = 10 * n + (s[i] - '0');
       return sign * n;
   }

3 Shell排序

Shell排序算法是D. L. Shell于1959年发明的,其基本思想是:先比较距离远的元素,而不是像简单交换排序算法那样先比较相邻的元素。这样可以快速减少大量的无序情况,从而减轻后续的工作。被比较的元素之间的距离逐步减少,直到减少为1,这时排序变成了相邻元素的互换。

   /* shellsort:  sort v[0]...v[n-1] into increasing order */
   void shellsort(int v[], int n)
   {
       int gap, i, j, temp;
       for (gap = n/2; gap > 0; gap /= 2)
           for (i = gap; i < n; i++)
               for (j=i-gap; j>=0 && v[j]>v[j+gap]; j-=gap) {
                   temp = v[j];
                   v[j] = v[j+gap];
                   v[j+gap] = temp;
               }
   }

4 倒置字符串s中各个字符的位置

   #include <string.h>
   /* reverse:  reverse string s in place */
   void reverse(char s[])
   {
       int c, i, j;
       for (i = 0, j = strlen(s)-1; i < j; i++, j--) {
           c = s[i];
           s[i] = s[j];
           s[j] = c;
       }
   }

5 将数字转换为字符串

   /* itoa:  convert n to characters in s */
   void itoa(int n, char s[])
   {
       int i, sign;
       if ((sign = n) < 0)  /* record sign */
           n = -n;          /* make n positive */
       i = 0;
       do {      /* generate digits in reverse order */
           s[i++] = n % 10 + '0';  /* get next digit */
       } while ((n /= 10) > 0);    /* delete it */
       if (sign < 0)
           s[i++] = '-';
       s[i] = '\0';
       reverse(s);
   }

6 删除字符串尾部的空格符、制表符与换行符

   /* trim:  remove trailing blanks, tabs, newlines */
   int trim(char s[])
   {
       int n;
       for (n = strlen(s)-1; n >= 0; n--)
           if (s[n] != ' ' && s[n] != '\t' && s[n] != '\n')
               break;
       s[n+1] = '\0';
       return n;
   }

转载请注明:http://blog.csdn.net/lsh_2013/article/details/45155901

时间: 2024-10-14 07:14:07

TCPL知识点总结(三)的相关文章

学习IOS开发UI篇--UI知识点总结(三) UIScrollView/UIPageControl/NSTimer

UIScrollView:常用属性 @property(nonatomic)   UIEdgeInsets     contentInset;               // default UIEdgeInsetsZero. add additional scroll area around content @property(nonatomic,getter=isPagingEnabled) BOOL   pagingEnabled;     // default NO. if YES,

iOS 常见知识点(三):Lock

iOS 常见知识点(一):Runtime iOS 常见知识点(二):RunLoop 锁是最常用的同步工具.一段代码段在同一个时间只能允许被有限个线程访问,比如一个线程 A 进入需要保护代码之前添加简单的互斥锁,另一个线程 B 就无法访问,只有等待前一个线程 A 执行完被保护的代码后解锁,B 线程才能访问被保护代码. iOS 中的八大锁 NSLock @protocol NSLocking - (void)lock; - (void)unlock; @end @interface NSLock :

mysql知识点(三)

1.表关联是可以利用两个表的索引的,如果是用子查询,至少第二次查询是没有办法使用索引的. 2.  为了给主查询提供数据而首先执行的查询被叫做子查询 3.如果WHERE子句的查询条件里使用了函数(WHERE DAY(column) = …),MySQL也将无法使用索引. 4.多表查询没有指定连接条件,会导致笛卡尔积的出现,返回行数等于2张表的行数乘积,返回6行记录 已知表T1中有2行数据,T2中有3行数据,执行SQL语句,“select a.* from T1 a,T2 b”后,返回的行数为6(n

初入web知识点(三)

◆HTML5标签 video视频(主要格式MOEG4) audio音频(主要格式MP3) <video src="地址"></video> <audio src="地址"></audio> *标签属性(主要) ①autoplay 自动播放 ②controls 显示控件 ③loop 循环播放◆块级元素和行内元素 块级元素 行内元素 独占一行 不独占一行 可设宽高 不可设宽高 内容大小影响不影响元素大小 内容大小不影响不影

多线程知识点(三)

NSOperationQueue作为全局队列,可以设置最大并发数 -(NSOperationQueue *)queue { if (_queue == nil) { _queue = [[NSOperationQueue alloc]init]; //最大并发数 _queue.maxConcurrentOperationCount  = } return _queue; } 2设置操作的暂停,继续,取消 - (IBAction)cancle:(id)sender { //取消操作 [self.q

C++primer知识点(三)

二十二: 1:拷贝控制操作 拷贝构造函数,拷贝赋值运算符,移动构造函数,移动赋值运算符,析构函数. 这些,在类的数据成员都能默认构造,拷贝,复制,销毁时,编译器默认都会有合成的版本. (1)   拷贝构造函数: Foo(const Foo&); 第一个参数是自身类类型的引用,额外的参数都有默认值. 几种情况下会被隐式使用,所以,不能是explicit 默认拷贝构造函数,又叫合成拷贝构造函数,也会逐元素的拷贝数组的成员. 拷贝初始化是依靠拷贝构造函数和移动构造函数来完成的. 调用的情况: 0)初始

Spring知识点总结(三)之注解方式实现IOC和DI

    1. 注解概念        所谓注解就是给程序看的提示信息,很多时候都用来作为轻量级配置的方式.        关于注解的知识点,参看java基础课程中java基础加强部分的内容.    2. Spring中的注解        Spring除了默认的使用xml配置文件的方式实现配置之外,也支持使用注解方式实现配置,这种方式效率更高,配置信息清晰,修改更方便,推荐使用.                引入context名称空间:            在MyEclipse中导入spri

《CSS权威指南》里提醒我们需要注意的小知识点(三)

17.内边距,边框和外边距 所有文档元素都生成一个矩形框,称为元素框,描述了一个元素在文档布局中所占的空间大小 块级元素:div  , p  , form,   ul,  li ,  ol, dl,    form,   address,  fieldset,  hr, menu,  table 行内元素:span,   strong,   em,  br,  img ,  input,  label,  select,  textarea,  cite 行内元素中的非替换元素设置width和h

TCPL知识点总结(一)

变量与表达式 1 整数除法操作将执行舍位. 2 浮点常量取的是整数,在书写时最好还是为它加上一个显示的小数点,这样可以强调其浮点信息,便于阅读. 3 在允许使用某种类型变量值的任何场合,都可以使用该类型的更复杂的表达式. for语句 4 for语句比较适合初始化和增长步长都是单条语句并且逻辑相关的情形,因为它将循环控制语句集中放在一起,且比while语句更紧凑. 符号常量 5 #define指令可以把符号常量定义为一个特点的字符串: #define 名字   替换文本 6 符号常量名通常用大写字