【算法导论】排序(一)

虽然久闻大名,但第一次接触算法导论,是看了网易公开课MIT的《算法导论》课,记得 第一集就讲到了 插入排序和归并排序。

几个星期前也买了算法导论这本书,准备慢慢啃~

这星期主要在看前两 部分,除了对于讲渐进时间、递归式分析这些东西感到云里雾里的,其它的都就

感觉越看越有觉得入 迷,果然不愧是一本经典之作

好吧,开始。本文主要是用C++把书中的算法实现,以及一些笔记。

一、插入排序。

插入算法的设计使用的是增量(incremental)方法:在排好子数组A[1..j- 1]后,将

元素A[ j]查入,形成排好序的子数组A[1..j]

插入排序的效率为O(n^2),在数据 规模较小的时候效率较高。

最佳的情况是一个数组已经是排好序的,只需O(n)。最坏情况是输入数 据是逆序的, O(n^2)。 对于一个算法,一般是考察它的最坏情况运行时间

伪代码:这里需要注意 的是由于大部分编程语言的数组都是从0开始算起,而伪代码是从1开始的

C++实现:

template <typename T>
void insert_sort(T *begin, T *end){  // 采用了更接近C++ STL sort的调用方式
    T *p,*t,key;
    for(p=begin+1; p!=end; ++p){
        // 把A[j]插入排好序的A[1...j-1]中
        key = *p;
        t=p-1;
        while(t>=begin && *t>key){
            *(t+1) = *t;
            --t;
        }
        *(t+1) = key;
    }
}

二、冒泡排序、选择排序、交换排序。

记得曾在刘汝佳的《算法竞赛入门经典》中看到一 段代码,书上说是冒泡排序,但是却和冒泡排序的过程有点不一样。一直到最近才知道,

原来那个应 该算作是交换排序。

选择排序伪代码:

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c++
, 算法
, 数组
, 递归
, 排序
, key
, 排序算法
, 算法导论
, 计算机科学导论
, c++ 选择排序
, 排序 编程 c++
, 算法导论习题堆排序
, c++排序算法
c++插入排序
算法导论 快速排序、归并排序 算法导论、算法导论 堆排序、堆排序 java 算法导论、算法导论第一章答案,以便于您获取更多的相关知识。

时间: 2024-10-25 15:10:23

【算法导论】排序(一)的相关文章

【算法导论】排序 (二):堆排序

四.(1)堆排序 第一次听堆排序是在107lab听忠哥讲的,但是没讲怎么实现.那时刚看了数据结 构的二叉树,还以为要通过指针建立二叉树的方式来实现,觉得挺难的. 其实堆排序实现没有想象中 的那么难. "堆"这个词最初是在堆排序中提出来的,但后来就逐渐指"废料收集储存区",就像程 序设计语言Lisp和Java中所提供的设施那样.我们这里的堆数据结构不是废料收集存储区. 堆排序的 运行时间与归并排序一样为O(n lg n),  但是一种原地(in place)排序. (

【算法导论】排序算法总结

排序算法总结         从六月初开始看算法导论,陆陆续续看了有2个月了,但实际看的时间只有半个月左右.这期间都忙着找导师.期末考试,同时还回家修养了十来天.真正专心的看算法是在离家返校后,由于没有考试和作业的烦恼,天天都沉浸在算法中,感觉效率较高.这段时间学到的东西较多,下面来总结一下:         学到的排序算法可以分为两类:比较排序.非比较排序.(这些排序算法的详细介绍及c程序实现在本文末都给出了链接,欢迎参考与指正!)         比较排序有:插入排序法.合并排序法.堆排序法

看算法导论有感(1)——谈谈算法的五性对用户体验的影响

做程序的人,都知道了算法的5性--可行性,健壮性,有穷性,高效性,可读性. 这15个字谁都会说了,但是,你是否真正的思考过这个对当今程序界最最重要的用户体验的思考. 过去,我也没多做思考,但是,看了mit的算法导论公开课,我却是觉得一个好的算法, 确实严格遵从算法算法五性. ①可行性--算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成.算法肯定要可行的,不可行的话,是一坨shit,一般可行性是与硬件息息相关.比如,10年前,你要先像现在的搜索引擎一样能够做视搜索,做各种各样的算法

基本数据结构(算法导论)与python

Stack, Queue Stack是后进先出, LIFO, 队列为先进先出, FIFO 在python中两者, 都可以简单的用list实现, 进, 用append() 出, Stack用pop(), Queue用pop(0), pop的时候注意判断len(l)  对于优先队列, 要用到前面讲到的堆 链表和多重数组 这些数据结构在python中就没有存在的价值, 用list都能轻松实现 散列表 为了满足实时查询的需求而产生的数据结构, 查询复杂度的期望是O(1), 最差为O(n) 问题描述, 对

【算法导论】二叉排序树

二叉排序树 二叉排序树的性质:每个节点的左子树中的所有节点的关键字都小于该节点的关键值,而右子树中的所有节点的关键字都大于该节点的关键值.  二叉排序树的构造 二叉排序树的构造是指将一个给定的数据元素构造为相应的二叉排序树. 基本思想为: 对于任给的一组数据元素{ R1, R2, -, Rn } , 可按以下方法来构造二叉排序树:         (1) 令R1为二叉树的根;          (2) 若R2<R1, 令R2为R1左子树的根结点,否则R2为R1右子树的根结点:         (

算法之排序算法的算法思想和使用场景总结_C 语言

1. 概述 排序算法是计算机技术中最基本的算法,许多复杂算法都会用到排序.尽管各种排序算法都已被封装成库函数供程序员使用,但了解排序算法的思想和原理,对于编写高质量的软件,显得非常重要. 本文介绍了常见的排序算法,从算法思想,复杂度和使用场景等方面做了总结. 2. 几个概念 (1)排序稳定:如果两个数相同,对他们进行的排序结果为他们的相对顺序不变.例如A={1,2,1,2,1}这里排序之后是A = {1,1,1,2,2} 稳定就是排序后第一个1就是排序前的第一个1,第二个1就是排序前第二个1,第

算法导论-1

算法导论一共7个部分,第一第二部分可以迅速看过:第三部分比较基础,要打好基础:第四部分很经典的几个算法,要认真琢磨:第五部分b树.二项堆.等:第六部分图算法,基本的几个算法掌握:第七部分是算法研究,学习字符串匹配等.   这一遍学习要注意课后题目了,不能像第一次那样草草看过! 2013.4.1----4.3  第一部分 基础知识  第二部分 排序和顺序统计学  编程珠玑是一本耐看的书,所以重在把握其中的思想.  这个从第八章开始,之前的已经在假期看过了.

C++编程:C++归并排序实现(算法导论)

  算法导论上的下标是从1开始的,但是为了和c++ STL的设计思想一致,所有函数的实现统一用左闭右开区间.中间修改了很多次,因为下标修改不是很容易就改掉的,需要始终维持循环不变式,稍微一个步骤出错就会使结果有些错误. #include #include #include #include using namespace std; void merge(int *A, int p, int q, int r) { //merge [p, r),左闭右开区间 int n1 = q - p, n2

算法导论 最大子数组数量问题

问题描述 算法导论 最大子数组数量问题 进行问题变换后,检查的子数组数量为什么会减少呢. 暴力求解方法有n(n-1)/2 种组合,进行问题变换后为什么有(n-1)(n-2)/2种组合呢,组合的数量应噶事保持不变的啊. 解决方案 http://www.cnblogs.com/chinaxmly/archive/2012/10/10/2718621.html 复杂度降低到O(n)