很早之前,为了应付数据结构考试。花了一星期多看了数据结构,当时觉得也没什么难的。

过了老久,总算是招报应了,做笔试题发现其实所有理解只是在表面,实际上我并不会实现,确实是这样,学术这东西真没捷径,还是要沉下心来才能有所见解。

看了清华慕课上邓老师的数据结构,决定自己跟着他的接口实现一下,于是也开始学c++,学了点语法,然后就开始实现了,说实话,真难。刚好今天写插入排序算法,所以也就记下来。

其实这是很简单的算法

好吧,废话不多说,插入排序,就是有一堆乱序的数据,如果要排好顺序,除了最直观的我们人最喜欢的选择排序外,应该就是插入排序了,从递归思路开始想,在排序过程中,一般我们都是分成排好的那一堆和还没排好的那一堆,我们在排序过程中,从没有排好的里面拿出最前面那个,然后找到排好那一堆里面的一个适当的位置,使得插入以后排好那一堆依然是有序的,于是排好的会一直增加,未排好的也会一直减退。保证了算法的有穷性。从迭代的思路当然是一开始,拿最开始那个,随便找个地方放上去,然后拿出下一个,比较如果大,就放在它后面,依次类推。

我c++的实现是这样的:

template<typename T>
void List<T>::insertionSort(Posi(T) p, int n)
{
Posi(T) runner = p;
p = p->next;
for (int i = ; i < n; i++)
{ int j = i+;
while (j-- > )
{
if ((p->data)>(runner->data)||p==header)
{
Posi(T) temp = p->next;
this->insertAsNext(p, runner);
runner = temp->pred;
p = temp;
break;
}
else
{
runner = runner->pred;
}
}
}
}

我相信直接看,肯定有疑问,首先,我这个方法是链表LIst类的一个保护成员,Posi(T)是这样的:

#define Posi(T) ListNode<T>*

每个链表节点,邓老师用了链表节点部件,我的接口声明当然是取至邓老师的教材。(这里有必要提一下)

我想算法并没有什么好说的,但是我在定义这个算法的过程中,遇到了点问题,其实一开始我的while循环是这样的:

if ((p->data)<(runner->data))
{
runner = runner->pred;
}
else
{
Posi(T) temp = p->next;
this->insertAsNext(p, runner);
runner = temp->pred;
p = temp;
break; }

其实是一样的,但是有个漏洞就是,如果,准备插入的元素如果是有序部分的最小,那么它会比较到有序序列的前一个,在这个链表类里应该是header哨兵,隐患很显而易见,在这个情况下是无法正常排序的。

所以我考虑了两种解决方案:

         if ((p->data)<(runner->data)&&p!=header)
{
runner = runner->pred;
}
else
{
Posi(T) temp = p->next;
this->insertAsNext(p, runner);
runner = temp->pred;
p = temp;
break; }

和我决定下一种:

if ((p->data)>(runner->data)||p==header)
{
Posi(T) temp = p->next;
this->insertAsNext(p, runner);
runner = temp->pred;
p = temp;
break;
}
else
{
runner = runner->pred;
}

之后看了邓老师的实现方法:

天啊,竟然忘记接口定义的search函数。罪过罪过,太水了。

好吧那我定义一下search

template<typename T>
Posi(T) List<T>::search(T const& e, int n, Posi(T) p) const
{
while (n-->)
{
p = p->pred;
if (p->data <= e)
{
return p;
}
}
return header;
}

书上版本:

插入排序和一点小感悟(c++版)的更多相关文章

  1. 我对android开发的一点小感悟小看法

    “Android”,“Android开发”等等这些词成了时下最热的词,也是时下大众最关注最吸引人眼球的话题,当然,最热门的行业也意味着高薪,好的就业环境,但同时也意味着强大的竞争力! Android系 ...

  2. ef core数据迁移的一点小感悟

    ef core在针对mysql数据迁移的时候,有些时候没法迁移...有两种情况没法迁移,一种是因为efcore的bug问题导致没法迁移,这个在github上有个问题集,另外一种是对数据表进行较大幅度的 ...

  3. 前端练手小项目——网页版qq音乐仿写

    qq音乐网页版仿写 一些步骤与注意事项 一开始肯定就是html+css布局和页面了,这段特别耗时间,耐心写完就好了 首先要说一下大致流程: 一定要先布局html!,所以一定要先分析页面布局情况,用不同 ...

  4. 关于win8开发的一点小总结

    我今天做画面的时候,发现了一点小问题. 我在xmal文件里面加了一个CheckBox控件,设置IsChecked属性为True,并添加了Checked事件.Checked事件里面有对另外一个TextB ...

  5. 关于PHP魔术方法__call的一点小发现

    好久没有上博客园写文章了,今晚终于有点空了,就来写一下昨天的一点小发现. 我自己所知,C++,Java的面向对象都有多态的特点,而PHP没有,但PHP可以通过继承链方法的重写来实现多态的属性.而魔术方 ...

  6. 【OCP|052】OCP最新题库解析(052)--小麦苗解答版

    [OCP|052]OCP最新题库解析(052)--小麦苗解答版 OCP最新题库解析历史连接(052):http://mp.weixin.qq.com/s/bUgn4-uciSndji_pUbLZfA ...

  7. 关于SSM的小感悟

    这周用SSM框架写了个小项目,真是各种百度啊,最后总算是实现了个登陆功能.刚才一直在修改,想实现登陆进去可以对id进行搜索,出现搜索的整体数据,无奈,一直没能实现.所以就只能留到下周了,到时候会把这个 ...

  8. net core体系-web应用程序-4net core2.0大白话带你入门-8asp.net core 内置DI容器(DependencyInjection,控制翻转)的一点小理解

    asp.net core 内置DI容器的一点小理解   DI容器本质上是一个工厂,负责提供向它请求的类型的实例. .net core内置了一个轻量级的DI容器,方便开发人员面向接口编程和依赖倒置(IO ...

  9. 微信小程序横版日历,tab栏

    代码地址如下:http://www.demodashi.com/demo/14243.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.co ...

随机推荐

  1. sql查询 所有被锁定的表

    --sql查询  所有被锁定的表 select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName ...

  2. z/os上的tar和gzip(3)

    前面两篇文章分别讲过了如何合并并压缩批量文件,如何解压缩并恢复批量文件, 这些问题解决了之后还剩下一个大问题,如何在网络上传输这些压缩过的文件,如果是linux的话非常简单,制定binary,然后ge ...

  3. ASP.NET MVC5 新特性:Attribute路由使用详解 (转载)

    1.什么是Attribute路由?怎么样启用Attribute路由? 微软在 ASP.NET MVC5 中引入了一种新型路由:Attribute路由,顾名思义,Attribute路由是通过Attrib ...

  4. Swift常量和变量

    常量和变量由一个特定名称来表示,如maxNumber 或者 message.常量所指向的是一个特定类型的值, 如数字10或者字符”hello”.变量的值可以根据需要不断修改,而常量的值是不能够被二次修 ...

  5. [置顶] Jquery学习总结(二) jquery选择器详解

    1.基本选择器 l ID 根据元素ID选择 l Elementname 根据元素名称选择 l Classname 根据元素css类名选择 举例: <input type=”text” id=”I ...

  6. scala匿名函数

    package com.ming.test import scala.math._ object AnonymousFunc { def valueAtOneQuarter(f:(Double)=&g ...

  7. api-ms-win-crt-runtimel1-1-0.dll缺失的解决方案

    api-ms-win-crt-runtime就是MFC的运行时环境的库, 在windows上编译也是用微软的visual studio C++编译的软件, 底层也会用到微软提供的C++库和runtim ...

  8. linux信号机制 - 用户堆栈和内核堆栈的变化【转】

    转自:http://itindex.net/detail/16418-linux-%E4%BF%A1%E5%8F%B7-%E5%A0%86%E6%A0%88 此文只简单分析发送信号给用户程序后,用户堆 ...

  9. (转)java线程安全问题之静态变量、实例变量、局部变量

    java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同<java并发编程实践>中所说: 写道 给线程安全下定义比较困难.存在很多种定义,如 ...

  10. 纯CSS实现nav导航栏+jQuery实现article区DIV切换

    效果图: main.html 代码: <!DOCTYPE html> <html> <head> <title>MyHomepage</title ...