归并排序(Merge Sort)

归并排序是稳定排序的一种,之所以说它稳定是因为,两个相等的数排序之后不会调换位置。(当然这个是比较业余的说法,如果想得到准确答案,问度娘。)归并排序的时间复杂度为O(nlgn),同时归并排序做较少改动就可以求逆序对,只需改动最后一个for循环就可以。 算法原理 1.二路归并排序是将两个已经有序的数组重新组合到一个有序的数组。 递归部分: 2.因为一个随机的数组分成两个数组(假设A和B)之后一般(A和B)不会是有序的,所以递归求解。 3.直到最后一个元素(一个元素是不用排序的),一个元素看成一个数组是有序的,所以递归返回。 非递归部分: 4.申请两个临时数组,用来存放分开的两组数据。 5.两个临时数组比较,哪边小就从哪边抽出元素放回原数组。(这里指的是升序排序) 6.直到没有。(为了少写代码,设置两个无穷大的数在数组的最后,效果自己模拟下看看)

2015年06月24日 · 2 分钟 · 974 字

POJ 1804 Brainman

Brainman Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 8755 Accepted: 4723 Description Background Raymond Babbitt drives his brother Charlie mad. Recently Raymond counted 246 toothpicks spilled all over the floor in an instant just by glancing at them. And he can even count Poker cards. Charlie would love to be able to do cool things like that, too. He wants to beat his brother in a similar task. Problem Here’s what Charlie thinks of. Imagine you get a sequence of N numbers. The goal is to move the numbers around so that at the end the sequence is ordered. The only operation allowed is to swap two adjacent numbers. Let us try an example: Start with: 2 8 0 3 swap (2 8) 8 2 0 3 swap (2 0) 8 0 2 3 swap (2 3) 8 0 3 2 swap (8 0) 0 8 3 2 swap (8 3) 0 3 8 2 swap (8 2) 0 3 2 8 swap (3 2) 0 2 3 8 swap (3 8) 0 2 8 3 swap (8 3) 0 2 3 8 ...

2015年06月23日 · 2 分钟 · 807 字

选择排序(Selection Sort)

选择排序是经典排序的一种,最差的时间复杂度为O(n^2),它的主要原理是直接从待排序数组里选择一个最小(或最大)的数字,每次都拿一个最小数字出来,顺序放入新数组,直到全部拿完。

2015年06月21日 · 1 分钟 · 442 字

插入排序的C语言实现

插入排序,稳定排序的一种,平均时间复杂度为O(n^2),它的代码量很小,对于处理小数据的排序还是可以的。 排序扑克牌可以形象地描述插入排序(贴近生活),算法导论就是用它来引入主题的。

2015年06月20日 · 2 分钟 · 721 字

Kruskal算法的C语言实现(并查集版)

Kruskal算法求加权连通图的最小生成树的算法。kruskal算法总共选择n- 1条边,所使用的贪婪准则是:从剩下的边中选择一条不会产生环路的具有最小耗费的边加入已选择的边的集合中。注意到所选取的边若产生环路则不可能形成一棵生成树。kruskal算法分e 步,其中e 是网络中边的数目。按耗费递增的顺序来考虑这e 条边,每次考虑一条边。当考虑某条边时,若将其加入到已选边的集合中会出现环路,则将其抛弃,否则,将它选入。

2014年02月23日 · 2 分钟 · 889 字

浅谈const关键字与指针、define、typedef混用

下面有四条声明,const修饰的到底是哪个?是a是常量还是*a是常量?由于只是关键字调换下顺序,是非常容易搞混的。我来详细说下。 1 2 3 4 const int * a = &b; int const * a = &b; int * const a = &b; const int * const a = &b; 区分它们是非常简单的,只需要下面记住两条规则: ...

2014年02月08日 · 2 分钟 · 953 字

Prim算法的C语言实现

普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值之和亦为最小。该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克发现;并在1957年由美国计算机科学家罗伯特·普里姆独立发现;1959年,艾兹格·迪科斯彻再次发现了该算法。因此,在某些场合,普里姆算法又被称为DJP算法、亚尔尼克算法或普里姆-亚尔尼克算法。

2014年02月01日 · 3 分钟 · 1148 字

[转载]数组名与指针

指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用。于是乎,很多程序猿就被搞糊涂了,错误地认为“数组名就是指针”。 想必这种误解的根源在于国内某著名的C程序设计教程。如果这篇文章能够纠正许多中国程序员对数组名和指针的误解,笔者就不甚欣慰了。借此文,笔者站在无数对知识如饥似渴的中国程序员之中,深深寄希望于国内的计算机图书编写者们,能以"深入探索"的思维方式和精益求精的认真态度来对待图书编写工作,但愿市面上多些融入作者思考结晶的心血之作! ...

2014年01月28日 · 4 分钟 · 1880 字

Dijkstra算法的C语言实现

Dijkstra算法可用于计算正权图的单源最短路(Single-Source Shortest Paths,SSSP),即从单个源点出发,到所有节点的最短路。该算法同时适用于有向图和无向图。 ...

2014年01月26日 · 2 分钟 · 803 字

可变参数的使用

通常情况下,我们一个函数的参数个数是固定的,传多了会报错,少了有时也可能报错。 例如: 1 int abc(int a, int b, int c); 若是想调用abc()这个函数,必须传给他三个实参,函数才能正常执行。但是,我想调用一个函数,他的参数个数不确定呢?比如我们经常用的printf(),想在屏幕上打印一些东西。很多时候,参数个数都是不一样的,例如: ...

2014年01月23日 · 4 分钟 · 1541 字