
算法
tjlakewalker
这个作者很懒,什么都没留下…
展开
-
排序算法之插入排序
最近各种笔试面试,排序算法考了一次又一次,发现非常有必要熟悉各种排序算法,能在很短时间将其正确书写于纸上,并且能够提交编译。学习材料:数据结构与算法分析——C语言描述1、插入排序插入排序是最简单的排序算法之一,插入排序由N-1趟排序组成,稳定排序,算法复杂度为O(n2)。其基本思想为:在待排序的数组A[0:N-1]中,前i(0 代码如下:void InsertionSort(ElementType A[], int N){ int j, p; ElementType Tmp; for(p =原创 2011-04-30 20:50:00 · 403 阅读 · 0 评论 -
排序算法之希尔排序
<br />2. 希尔(Shell)排序<br /> <br />希尔排序中维护着一个按照某个规律逐渐缩小的增量,算法则按照这个增量的间距比较元素,进行子序列的插入排序,直到增量变为1,完成最后一轮比较排序。<br /> <br />希尔排序时间复杂度最坏情况下为O(n2),其平均时间复杂度与每次选择的增量密切相关,但要优于插入排序。<br /> <br />下面的实现中,增量Increment的选择为N/2(N为原始数组的长度)。从代码中可以看出每一轮的比较和交换,都是由较小的选择排序组成。<br />原创 2011-05-06 15:36:00 · 861 阅读 · 0 评论 -
排序算法之快速排序
参考:http://www.cnblogs.com/cj723/archive/2011/04/27/2029993.html 《大话数据结构》快速排序快速排序是最经典效率最高的排序算法,其最优时间复杂度为O(nlogn),平均时间复杂度为O(nlogn),最差情况为O(n2).其基本思想是首先确定一个枢纽,然后寻找一个恰当的位置,使得枢纽前的序列均小于枢纽,枢纽后的序列大于枢纽。然后使用分治递归的方法处理枢纽两端的子序列,直至子序列长度为0或1。在此,枢纽的选择是有讲究的,不明智的方法是选择待排序序列的原创 2011-05-15 15:23:00 · 406 阅读 · 0 评论 -
排序算法之计数排序
<br />今在学习中,遇到计数排序算法,虽然其对待排序的序列要求严格,但对于符合条件的序列来说,其时间复杂度很小。故列于此,仅为学习记忆。<br /> <br />参考资料:http://blog.youkuaiyun.com/v_JULY_v/archive/2011/04/23/6347454.aspx<br /> <br />对于仅由大写字母(或小写字母)构成的无序序列,可采用下面算法进行排序。该算法不在序列的每个元素间进行比较,而是使用了一个额外的help整型字符串来记录每个元素出现的频度,然后通过一个巧妙的原创 2011-05-23 16:12:00 · 408 阅读 · 0 评论 -
排序算法之堆排序
参考资料:http://www.7747.net/kf/201104/88993.html 《大话数据结构》第9章 排序 9.7 堆排序以上页面非常详细以源码+图示的方法讲述了堆排序的全部过程,在此记录,仅为个人学习笔记。堆排序的基本思想为:将待排序的序列构造成大顶堆(大顶堆:非叶子节点的儿子均小于父亲节点的完全二叉树(完全二叉树,最底一层不必满,不是满二叉树)),该堆的根节点为最大元素,将此元素取出,然后将最后一个元素换至根节点处,再次构造大顶堆,循环至所有元素取出。堆排序的的算法复杂度为O(nlogn原创 2011-05-12 22:45:00 · 649 阅读 · 0 评论 -
排序算法之归并排序
<br />参考:数据结构与算法分析——C语言描述<br /> <br />归并排序是递归思想的典型应用,其基本思想是将待排序的无序序列划分为两部分,然后分别将该两部分进行排序,然后再把排序好的两个子序列合并成一个有序序列。分治思想体现在,对划分好的两个子序列再进行划分,直到子序列最小,达到临界值(子序列中只有一个元素)。<br /> <br />归并算法的时间复杂度为O(nlogn)。<br /> <br />源代码如下<br /> <br />void MergeSort(ElementType A[]原创 2011-05-13 15:13:00 · 397 阅读 · 0 评论