`

常用算法

 
阅读更多

1.插入排序

基本思想:

 在已排序的i条记录中插入一条新记录,得到有序的i+1条记录。

特别提示:可以牺牲数组0的空间来作为插入的中间变量。 

改进插入顺序:如果在插入过程中奖顺序查找改为折半查找,那么关键字的比较次数可以减少,记录的移动次数不变。 

链式插入排序:不用数组而用链表存储数据,就不需要移动数据而仅仅需要改变链即可以实现

 

要点:设立哨兵,作为临时存储和判断数组边界之用。

 

直接插入排序示例:

 

 

如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。

 

2、插入排序—希尔排序

基本思想:

先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。

操作方法:

  1. 选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;
  2. 按增量序列个数k,对序列进行k 趟排序;
  3. 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

希尔排序的示例:

 

算法实现:

我们简单处理增量序列:增量序列d = {n/2 ,n/4, n/8 .....1} n为要排序数的个数

即:先将要排序的一组记录按某个增量d(n/2,n为要排序数的个数)分成若干组子序列,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。继续不断缩小增量直至为1,最后使用直接插入排序完成排序。

 

3. 选择排序

基本思想:

在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。

简单选择排序的示例:

 

操作方法:

第一趟,从n 个记录中找出关键码最小的记录与第一个记录交换;

第二趟,从第二个记录开始的n-1 个记录中再选出关键码最小的记录与第二个记录交换;

以此类推.....

第i 趟,则从第i 个记录开始的n-i+1 个记录中选出关键码最小的记录与第i 个记录交换,

直到整个序列按关键码有序。

 

4. 交换排序—冒泡排序(Bubble Sort)

基本思想:

在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

冒泡排序的示例:

 

 

他的改进算法: 快速排序

它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

 

百度文库:

http://baike.baidu.com/item/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95?fr=aladdin

 

5、归并排序 

基本思想

将两个有序的列表归并成一个有序列表的方法

归并操作

归并操作(merge),也叫归并算法,指的是将两个顺序序列合并成一个顺序序列的方法。
如 设有数列{6,202,100,301,38,8,1}
初始状态:6,202,100,301,38,8,1
第一次归并后:{6,202},{100,301},{8,38},{1},比较次数:3;
第二次归并后:{6,100,202,301},{1,8,38},比较次数:4;
第三次归并后:{1,6,8,38,100,202,301},比较次数:4;
总的比较次数为:3+4+4=11,;
逆序数为14;

算法描述

归并操作的工作原理如下:
第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针超出序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
 

6、堆排序 

基本思想

堆实质是满足如下性质的完全二叉树,树中任一非叶节点的关键字不大于(或不小于)其左右孩子结点的关键字。 

根节点的关键字是堆里所有节点关键字中最小者的堆称为小顶堆; 堆是一种完全二叉树,一般使用数组来实现。

 

算法分析

堆排序的时间,主要由建立初始堆和反复重建堆这两部分的时间开销构成,它们均是通过调用Heapify实现的。

平均性能

O(N*logN)。

其他性能

由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。
堆排序是就地排序,辅助空间为O(1).
它是不稳定的排序方法。
 

7、哈夫曼算法

基本思想:

它是由n个带权叶子结点构成的所有二叉树中带权路径长度最短的二叉树。

因为这种树最早由哈弗曼(Huffman)研究,所以称为哈弗曼树,又叫最优二叉树。

 

哈夫曼树创建用了两种的方法,一种是基于顺序表,另一种是基于最小堆。

 

建立Huffman树的基本思路:

给定有权重的一系列数据(带权重),从中挑选最小权重的两个数据,组成一棵树,得到的父节点再插入到数据系列当中。

 

8、哈夫曼压缩算法

哈夫曼压缩思路

假设一字符串是,“abcabcabcabcabcabcddddddddd”,统计各字符出现的次数如下表。

字符 出现次数

a 6

b 6

c 6

d 9

按照一搬的存储方法,一个字符占用一个字节,那么共花费(6+6+6+9)*sizeof(char) = 27字节,27字节确实不算什么,但是如果是海量数据的时候,就可能要考虑存储空间的问题了。

 

来看看哈夫曼压缩算法是怎么做的,同样是上面的例子,我们试着建立哈夫曼树,出现的次数就当做是权重,出现的次数越多的话,越靠近根节点,那么编码越短,如下图:

 

于是上面的“abcabcabcabcabcabcddddddddd”,就可以转化为“0001,1000,0110,0001,1000,0110,0001,1000,0110,1111,1111,1111,1111,11”,注意这里采用的按位存储的,也就是说0和1都是位,而非char型。那么之前的27字节就被我们转换成了7个字节(7字节不足,不足的话就补零),而这就达到了压缩的效果。

所以总结一下:利用哈夫曼树编码的特点,权重越大越靠近根节点,得到的编码就越短的原理,而如果把字符出现次数作为权重的话,文本当中出现次数最多的字符就被压缩成了很短的编码。

 

//todo

  • 大小: 10.6 KB
分享到:
评论

相关推荐

    数学建模30个常用算法(Python)

    数学建模30个常用算法(Python)数学建模30个常用算法(Python)数学建模30个常用算法(Python)数学建模30个常用算法(Python)数学建模30个常用算法(Python)数学建模30个常用算法(Python)数学建模30个常用算法...

    模型算法大全(20+种常用算法模型+代码实现)

    模型算法大全(20+种常用算法模型+代码实现)模型算法大全(20+种常用算法模型+代码实现)模型算法大全(20+种常用算法模型+代码实现)模型算法大全(20+种常用算法模型+代码实现)模型算法大全(20+种常用算法模型+...

    常用算法程序集-徐士良-常用算法程序集-徐士良

    《常用算法程序集-徐士良》是一本深入探讨计算机科学中常见算法的书籍,作者徐士良在书中详尽地介绍了多种实用算法,并通过实际的程序代码来帮助读者理解和应用这些算法。这本书旨在提高读者的编程技能和解决实际...

    常用算法 常用算法 常用算法

    本篇文章将深入探讨"常用算法"这一主题,旨在帮助你理解并掌握这些算法的基本概念、应用场景及实现方法。 首先,让我们从排序算法开始。排序算法是计算机科学中最基础且广泛使用的算法之一,例如冒泡排序、插入排序...

    C常用算法程序集,各种经典算法

    本压缩包文件“C常用算法程序集”显然是一份包含了多种常见算法的代码集合,旨在帮助程序员理解和实践这些算法。 首先,我们来探讨一些基础的C语言算法。C语言中的基本算法包括排序算法、查找算法、递归算法、字符...

    常用算法程序集(CC++描述)

    《常用算法程序集C\C++描述》是一本深入浅出的计算机教材,旨在教授和实践常用的计算机算法。这本书以C和C++语言为载体,详细解释了多种算法的设计原理和实现方式,对于学习和理解算法有着极大的帮助。下面将分别就...

    常用算法程序集,第6版

    《常用算法程序集》第6版是一本涵盖了广泛算法实现的宝贵资源,旨在帮助程序员提升在实际编程中解决复杂问题的能力。这本书包含了多种经典和现代的算法,通过代码实例进行详细解析,使得读者能深入理解并掌握这些...

    嵌入式系统软件设计中的常用算法(完整版).zip_stormbdm_嵌入式_嵌入式算法_嵌入式系统软件设计中的常用算法_常用软件

    嵌入式系统软件设计中的常用算法(完整版)

    杨克昌 计算机常用算法与程序设计教程

    《杨克昌 计算机常用算法与程序设计教程》是一本深入浅出地介绍计算机算法和程序设计的优秀教材。作者杨克昌在书中详细阐述了计算机科学中常见的算法和程序设计技巧,旨在帮助读者理解和掌握这些核心概念,从而提升...

    常用算法程序集Fortran徐士良-第二版_Fortran_算法_

    在"常用算法程序集Fortran徐士良-第二版"中,我们可以期待找到一系列适用于各种计算任务的算法实现,这些算法是编程实践中非常重要的基础。 Fortran语言最初设计时是为了简化数值计算和科学计算的编写,因此它对...

    CH6_c常用算法程序集-徐士良著_

    《CH6_c常用算法程序集-徐士良著》是一本专注于C语言编程中的常见算法实现的书籍。这本书的第六章涵盖了多个核心算法,通过C语言编写,旨在帮助读者理解和应用这些算法。徐士良是一位知名的计算机科学教育者,他的...

    VB常用算法大全:VB常用算法大全

    VB常用算法大全涵盖了多种在编程实践中经常遇到的算法,这些算法在处理数据、优化代码效率、解决逻辑问题等方面起着关键作用。以下是VB常用的一些重要算法及其详细解释: 1. **排序算法**: - 冒泡排序:通过重复...

    常用算法程序集(C++)(徐士良 )

    《常用算法程序集(C++)》是由徐士良编写的C++算法代码集合,针对的是专业人士,旨在提供一个丰富的算法实现参考。这个资源对于学习和理解计算机科学中的基础及高级算法具有很高的价值。以下是对其中可能包含的一些...

    常用算法程序集源代码

    "常用算法程序集源代码"这个资源集合了一组常见的算法实现,主要以C/C++语言编写,为程序员提供了学习和实践算法的良好平台。C/C++作为底层编程语言,具有高效、灵活的特点,是实现算法的理想选择。 1. **排序算法*...

    电子计算机常用算法 电子计算机常用算法

    《电子计算机常用算法》这本书是算法学习的重要参考资料,它涵盖了计算机科学中许多核心的算法,旨在帮助读者理解和掌握这些算法的原理与应用。算法在计算机科学中扮演着基础且关键的角色,它们是解决问题和设计高效...

    C语言常用算法(很全,内有详细例子)

    常用算法一 一、计数、求和、求阶乘等简单算法 此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条件,更要注意用来表示计数、和、阶乘的变量的初值。 例:计算 直到最后一项的绝对值小于1e-7时...

    VB常用算法大全 收录了众多常用算法

    《VB常用算法大全》是一本专注于Visual Basic编程语言中常用算法的资源集合,它涵盖了从基础到高级的各种算法实现,旨在帮助VB程序员提升算法理解和应用能力。在这个压缩包中,可能包含了详细的算法介绍、示例代码...

    Java常用算法手册(jb51.net)_Java常用算法手册_

    《Java常用算法手册》是一本面向Java初学者的算法指南,旨在通过深入浅出的方式,帮助读者理解并掌握各种常见的编程算法,从而提高他们的编程能力和解决问题的效率。这本书的覆盖范围广泛,涉及到算法基础、数据结构...

    常用算法程序集(C语言描述)(第三版)清华大学

    《常用算法程序集》(C语言描述)第三版是由清华大学出版社出版的一本经典算法书籍,其主要内容涵盖了广泛的算法实现,全部以C语言为编写工具。这本书不仅包含了经典的算法,也结合了作者的实践经验与现代数值计算的...

    Java常用算法手册

    资源名称:Java常用算法手册内容简介:现代的设计任务大多通过计算机编程来完成,而算法起到了至关重要的作用。可以毫不夸张地说,算法是一切程序设计的灵魂和基础。选择合理的算法,可以起到事半功倍的效果。 赵...

Global site tag (gtag.js) - Google Analytics