插入排序和一点小感悟(c++版)
很早之前,为了应付数据结构考试。花了一星期多看了数据结构,当时觉得也没什么难的。
过了老久,总算是招报应了,做笔试题发现其实所有理解只是在表面,实际上我并不会实现,确实是这样,学术这东西真没捷径,还是要沉下心来才能有所见解。
看了清华慕课上邓老师的数据结构,决定自己跟着他的接口实现一下,于是也开始学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++版)的更多相关文章
- 我对android开发的一点小感悟小看法
“Android”,“Android开发”等等这些词成了时下最热的词,也是时下大众最关注最吸引人眼球的话题,当然,最热门的行业也意味着高薪,好的就业环境,但同时也意味着强大的竞争力! Android系 ...
- ef core数据迁移的一点小感悟
ef core在针对mysql数据迁移的时候,有些时候没法迁移...有两种情况没法迁移,一种是因为efcore的bug问题导致没法迁移,这个在github上有个问题集,另外一种是对数据表进行较大幅度的 ...
- 前端练手小项目——网页版qq音乐仿写
qq音乐网页版仿写 一些步骤与注意事项 一开始肯定就是html+css布局和页面了,这段特别耗时间,耐心写完就好了 首先要说一下大致流程: 一定要先布局html!,所以一定要先分析页面布局情况,用不同 ...
- 关于win8开发的一点小总结
我今天做画面的时候,发现了一点小问题. 我在xmal文件里面加了一个CheckBox控件,设置IsChecked属性为True,并添加了Checked事件.Checked事件里面有对另外一个TextB ...
- 关于PHP魔术方法__call的一点小发现
好久没有上博客园写文章了,今晚终于有点空了,就来写一下昨天的一点小发现. 我自己所知,C++,Java的面向对象都有多态的特点,而PHP没有,但PHP可以通过继承链方法的重写来实现多态的属性.而魔术方 ...
- 【OCP|052】OCP最新题库解析(052)--小麦苗解答版
[OCP|052]OCP最新题库解析(052)--小麦苗解答版 OCP最新题库解析历史连接(052):http://mp.weixin.qq.com/s/bUgn4-uciSndji_pUbLZfA ...
- 关于SSM的小感悟
这周用SSM框架写了个小项目,真是各种百度啊,最后总算是实现了个登陆功能.刚才一直在修改,想实现登陆进去可以对id进行搜索,出现搜索的整体数据,无奈,一直没能实现.所以就只能留到下周了,到时候会把这个 ...
- net core体系-web应用程序-4net core2.0大白话带你入门-8asp.net core 内置DI容器(DependencyInjection,控制翻转)的一点小理解
asp.net core 内置DI容器的一点小理解 DI容器本质上是一个工厂,负责提供向它请求的类型的实例. .net core内置了一个轻量级的DI容器,方便开发人员面向接口编程和依赖倒置(IO ...
- 微信小程序横版日历,tab栏
代码地址如下:http://www.demodashi.com/demo/14243.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.co ...
随机推荐
- 自建目录中jsp页面访问servlet路径出错404
---恢复内容开始--- 自建目录中jsp页面访问servlet路径出错404 使用eclipse建立的项目,总是会遇到路径问题,比如jsp页面访问servlet,jsp在默认的路径.jsp在自建目录 ...
- java数组获取最值
import java.util.Random; /** * 获取最大值最小值 * @author shaobn * */ public class Test2 { public static voi ...
- java 字符串转json,json转对象等等...
@RequestMapping(value = "updateInvestorApplyAccountNo", method = RequestMethod.POST) @Resp ...
- centos的用户管理相关命令所在的包
用户管理命令是指:useradd userdel groupadd groupdel 这些 这些命令出自一个叫 shadow-utils 的包. 对于配置文件 /etc/shadow ,则来自一个叫 ...
- windows中的上帝模式开启方法
在任何地方创建一个新的文件夹 把文件夹命名为"GodMode.{ED7BA470-8E54-465E-825C-99712043E01C}" 回车,ok了
- java.io.DataInput接口和java.io.DataOutput接口详解
public interface DataInput DataInput 接口用于从二进制流中读取字节,并重构所有 Java 基本类型数据.同时还提供根据 UTF-8 修改版格式的数据重构 Strin ...
- DataGridView 些许事件测试
原始设计需求:当单元格内容是空白时,鼠标进入之后,显示一些数据 直观的第一感觉必然是用CellClick,细想,如果用户不用鼠标,直接按Tab键切换单元格呢?又或者,用户直接双击涅~ 主要测试的是: ...
- 目前主流的国产WebApp框架
1.FrozenUI:QQ 2.WeUI:WeChat 3.SUI:Taobao
- android简单的夜间模式
现在android项目values下打 attrs.xml <?xml version="1.0" encoding="utf-8"?> <r ...
- 视频处理控件TVideoGrabber如何重新编码视频
TVideoGrabber中可以对音频.视频剪辑进行重新编码剪辑,多的朋友知道这个功能更点,但是具体操作上还是不是很熟悉,这里总结一下,主要步骤如下: 1.通过指定开始和停止的时间,可以简单的剪辑视频 ...