随笔分类 - Algorithms
some simple Algorithms maybe helpful
摘要:问题:用1,2,3,...,9组成3个三位数abc,def,和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3。输出所有解。提示:不必太动脑筋。 // 习题2-10 样例(permutation) #include int main(void) { int x, y, z, a[10] = {0}; for(x = 100; x <...
阅读全文
摘要:Question: Let us suppose we have an array whose ith element gives the price of a share on the day i.If you were only permitted to buy one share of the stock and sell one share of the stock, design an...
阅读全文
摘要:符号表的实现有很多方式,下面介绍其中的几种。 乱序(未排序)数组实现 这种情况,不需要改变数组,操作就在这个数组上执行。在最坏的情况下插入,搜索,删除时间复杂度为O(n)。 有序(已排序)数组实现 这种情况我们就有了排序好的关键字和相应的值。 通过关键字在数组中存储 keys[i]为第i位大的key(关键字) values[i]就是第i位大key对应的值 由于元素是按顺序存储在数组中的,找某个...
阅读全文
摘要:枚举给用户定义固定数据组提供了方便。枚举类就是一系列常量整型值,这也就意味着枚举类型不能被修改。 这里我们将要讨论C语言中枚举类型的用法和限制。 枚举通过枚举关键值定义,类似结构体定义 语法(Syntax): enum tagname{CONST1=1,CONST2,…} enumVariable; tagname,枚举类型名,这一项可以省略。 {CONST1=1,CONST2,…}一组代替常量...
阅读全文
摘要:Question: What is a Pointer? What are its limitations? What are its benefits? How do we use it? What all operation we can perform using it? In this article we are going to discover answers to all the...
阅读全文
摘要:属于空间复杂度(Space Complexity)在很多情况下被错认为是附属空间(Auxiliary Space),下面是附属空间和空间复杂度的定义。 附属空间(Auxiliary Space)是算法使用的额外空间(extra space)或临时空间(temporary space)。 空间复杂度(Space Complexity)指的是算法使用的总空间包括输入使用的空间。 空间复杂度包含附属空间...
阅读全文
摘要:如果具有同样关键字的纪录的在排序前和排序后相对位置保持不变。一些算法本身就是稳定的,如插入排序,归并排序,冒泡排序等,不稳定的算法有堆排序,快速排序等。然而,一个本身不稳定的算法通过一点修正也能变成稳定的算法。有一些特定的方式可以做到,一般来说,任何排序算法中的比较本质上都是不稳定的,通过修改关键的...
阅读全文
摘要:选择排序就是在选择数组元素上做文章,关键是如何选择?选择的标准是什么?选择之后放在哪?所有这些都是选择排序的问题。 选择排序算法中,通常会有以下操作: 从数组第一个元素开始。 遍历整个数组,找到最小的元素。 将最小的元素与数组第一个元素交换。 从第二个元素开始重复上述步骤。 看一个例子: 可以看到,一开始的数组是乱序的,红色的方块代表排好序的元素,蓝色的代表未排序的元素。 从元素7开始,扫...
阅读全文
摘要:快速排序是初学者比较难理解的几个算法之一,这里尽可简单化地讲解,希望能帮到大家。 快速排序基本步骤: 从数列中挑出一个元素,称为"基准"(pivot)。 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。 递归地(recursive)把小于基准值元素...
阅读全文
摘要:归并排序是颇受欢迎的排序算法,因为他的时间复杂度恒为O(n log(n))。顾名思义,这个排序算法就是将多个排好序的数组合并成单个排好序的数组。 具体步骤如下: 将待排序的数组分成左右两部分。 再将这两部分分别分成左右两部分。 一直分下去,直到不可分(每部分只有一个元素)。 由于数组被分成许多的单个数据,比较起来就简单了,然后开始合并,合并的同时排序。 持续合并直到得到排好序的数组。 下...
阅读全文
摘要:Question: We have 2 sorted arrays and we want to combine them into a single sorted array. Input: arr1[] = 1, 4, 6, 8, 13, 25 || arr2[] = 2, 7, 10, 11, 19, 50Output: 1, 2, 4, 6, 7, 8, 10, 11, 1...
阅读全文
摘要:这是排序算法中最常见的排序方法,也是初学者使用最多的。有时候我们在生活中也会不自觉地用到插入排序,例如: 给手里的牌排序 这是最常见的例子之一,我们通常从纸牌的一边开始看,找到一张位置不正确的,把它拿出来,再从开始的位置开始找,直到找到合适者张牌插入的位置。 假设手里有这几张牌2,4,6,3,10,K,J。排序的步骤如下: 假设我们从左边开始看,2位置正确,4位置正确,6位置正确,3错误,...
阅读全文
摘要:未被初始化的变量称为野指针(wild pointer)。顾名思义,我们不知道这个指针指向内存中的什么地址,使用不当程序会产生各种各样的问题。 理解下面的例子: int main() { int *p; // wild pointer, some unknown memory location is pointed *p = 12; // Some unknown memory...
阅读全文
摘要:程序中的内存泄漏是怎么回事呢? 我们写过很多带有关键词free()的程序。比如我在这篇博文关于链表的一些重要操作(Important operations on a Linked List)中删除整个链表用到这个函数,代码片断如下: struct node * deleteList(struct node * head) { struct node * temp; while(h...
阅读全文
摘要:上篇博文中讨论了链表的一些基本操作:链表的基本操作(Basic Operations on a Linked List)然而,为创建一个多功能的链表,在深度学习之前我们还需要了解更多的链表操作。在表头插入元素。在表中插入元素。在确定的位置插入。在某个元素的后面插入。从链表中删除一个元素。删除整个链表...
阅读全文
摘要:链表可以进行如下操作:创建新链表增加新元素遍历链表打印链表下面定义了对应以上操作的基本函数。创建新链表新链表创建之后里面并没有任何元素,我们要为数据在内存中分配节点,再将节点插入链表。由于这个链表只有一个节点,它所指向的下一个节点为NULL。/*Defining a function to crea...
阅读全文
摘要:C语言中有三种类型的循环:for,while,do-while。 while循环先判断循环条件。 while (condition) { //gets executed after condition is checked } do-while循环先执行循环体重的语句,再判断循环条件。 do { //gets executed at least once } while (con...
阅读全文
摘要:什么是搜索? 在计算机科学中,搜索就是在一个事物的集合中找到具有特定特征的一项的过程。这些集合中的元素可能是排好序的数据库中的记录,简单数组中的数据,文件中的文本,树中的节点,几何图形中的点和边或者是其他搜索空间的元素。 搜索有什么作用? 搜索是计算机科学的核心算法之一。我们都知道现代的计算机存储了很多数据和信息,为了快速的获取我们所要的信息我们就需要高效的搜索算法。有一些数据组织方法可以加快搜索...
阅读全文
摘要:当我们在字典中查找某个单的时候,一般我们会翻到一个大致的位置(假设吧,翻到中间位置),开始查找。如果翻到的正好有我们要的词,那运气好,查找结束。如果我们要找的词还在这个位置的前面,那我们对前面的这一半词典继续搜索,翻到某个位置(假设是四分之一的位置)等等。这个二分搜索的工作原理一样。相应的算法就叫做二进制搜索算法。 迭代版本算法: //iterative binary search which r...
阅读全文
摘要:如果数组元素已经排过序(升序),那我们搜索某个元素就不必遍历整个数组了。在下面给出的算法代码中,到任何一点,假设当前的arr[i]值大于搜索的值data,就可以停止搜索了。 #include // a function to search "data" in an array "arr" of size "size" // returns 1 if the element is present...
阅读全文