摘要: 如果具有同样关键字的纪录的在排序前和排序后相对位置保持不变。一些算法本身就是稳定的,如插入排序,归并排序,冒泡排序等,不稳定的算法有堆排序,快速排序等。然而,一个本身不稳定的算法通过一点修正也能变成稳定的算法。有一些特定的方式可以做到,一般来说,任何排序算法中的比较本质上都是不稳定的,通过修改关键的... 阅读全文
posted @ 2015-08-13 14:34 programnote 阅读(407) 评论(0) 推荐(0) 编辑
摘要: 选择排序就是在选择数组元素上做文章,关键是如何选择?选择的标准是什么?选择之后放在哪?所有这些都是选择排序的问题。 选择排序算法中,通常会有以下操作: 从数组第一个元素开始。 遍历整个数组,找到最小的元素。 将最小的元素与数组第一个元素交换。 从第二个元素开始重复上述步骤。 看一个例子: 可以看到,一开始的数组是乱序的,红色的方块代表排好序的元素,蓝色的代表未排序的元素。 从元素7开始,扫... 阅读全文
posted @ 2015-08-12 16:04 programnote 阅读(654) 评论(0) 推荐(0) 编辑
摘要: 快速排序是初学者比较难理解的几个算法之一,这里尽可简单化地讲解,希望能帮到大家。 快速排序基本步骤: 从数列中挑出一个元素,称为"基准"(pivot)。 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。 递归地(recursive)把小于基准值元素... 阅读全文
posted @ 2015-08-12 15:05 programnote 阅读(308) 评论(0) 推荐(0) 编辑
摘要: 归并排序是颇受欢迎的排序算法,因为他的时间复杂度恒为O(n log(n))。顾名思义,这个排序算法就是将多个排好序的数组合并成单个排好序的数组。 具体步骤如下: 将待排序的数组分成左右两部分。 再将这两部分分别分成左右两部分。 一直分下去,直到不可分(每部分只有一个元素)。 由于数组被分成许多的单个数据,比较起来就简单了,然后开始合并,合并的同时排序。 持续合并直到得到排好序的数组。 下... 阅读全文
posted @ 2015-08-12 10:54 programnote 阅读(434) 评论(0) 推荐(0) 编辑
摘要: 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... 阅读全文
posted @ 2015-08-12 10:35 programnote 阅读(276) 评论(0) 推荐(0) 编辑
摘要: 这是排序算法中最常见的排序方法,也是初学者使用最多的。有时候我们在生活中也会不自觉地用到插入排序,例如: 给手里的牌排序 这是最常见的例子之一,我们通常从纸牌的一边开始看,找到一张位置不正确的,把它拿出来,再从开始的位置开始找,直到找到合适者张牌插入的位置。 假设手里有这几张牌2,4,6,3,10,K,J。排序的步骤如下: 假设我们从左边开始看,2位置正确,4位置正确,6位置正确,3错误,... 阅读全文
posted @ 2015-08-12 10:01 programnote 阅读(329) 评论(0) 推荐(0) 编辑
摘要: 未被初始化的变量称为野指针(wild pointer)。顾名思义,我们不知道这个指针指向内存中的什么地址,使用不当程序会产生各种各样的问题。 理解下面的例子: int main() { int *p; // wild pointer, some unknown memory location is pointed *p = 12; // Some unknown memory... 阅读全文
posted @ 2015-08-11 15:49 programnote 阅读(828) 评论(0) 推荐(0) 编辑
摘要: 程序中的内存泄漏是怎么回事呢? 我们写过很多带有关键词free()的程序。比如我在这篇博文关于链表的一些重要操作(Important operations on a Linked List)中删除整个链表用到这个函数,代码片断如下: struct node * deleteList(struct node * head) { struct node * temp; while(h... 阅读全文
posted @ 2015-08-11 15:28 programnote 阅读(384) 评论(0) 推荐(0) 编辑
摘要: 上篇博文中讨论了链表的一些基本操作:链表的基本操作(Basic Operations on a Linked List)然而,为创建一个多功能的链表,在深度学习之前我们还需要了解更多的链表操作。在表头插入元素。在表中插入元素。在确定的位置插入。在某个元素的后面插入。从链表中删除一个元素。删除整个链表... 阅读全文
posted @ 2015-08-11 14:58 programnote 阅读(405) 评论(0) 推荐(0) 编辑
摘要: 链表可以进行如下操作:创建新链表增加新元素遍历链表打印链表下面定义了对应以上操作的基本函数。创建新链表新链表创建之后里面并没有任何元素,我们要为数据在内存中分配节点,再将节点插入链表。由于这个链表只有一个节点,它所指向的下一个节点为NULL。/*Defining a function to crea... 阅读全文
posted @ 2015-08-11 14:19 programnote 阅读(515) 评论(0) 推荐(0) 编辑