归并排序
《算法(第4版)》笔记
归并
归并排序基于“归并”这个简单的操作,即将两个有序的数组归并成一个更大的有序数组。
要将一个数组排序,可以先(递归地)将它分成两半分别排序,然后将结果归并起来。
// c++
template<class T>
void merge(T& a, int lo, int mid, int hi, T& aux)
{
// 将a[lo .. mid]和a[mid+1 .. hi]归并
int i = lo;
int j = mid + 1;
for (int k=lo; k<=hi; ++k)
aux[k] = a[k];
for (int k=lo; k<=hi; ++k)
{
if (i > mid)
a[k] = aux[j++];
else if (j > hi)
a[k] = aux[i++];
else if (aux[j] < aux[i])
a[k] = aux[j++];
else
a[k] = aux[i++];
}
}
初级排序算法
《算法(第4版)》笔记
选择排序
首先,找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)。再次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。这种方法叫做选择排序,因为它在不断地选择剩余元素之中的最小者。
选择排序的缺点:一个已经有序的数组或是主键全部相等的数组和一个元素随机排列的数组所用的排序时间竟然一样长。
// c++
// 将容器a按升序排列
template<class T>
void selection_sort(T& a)
{
int n = a.size();
for (int i=0; i<n; ++i)
{
int min = i;
for (int j=i+1; j<n; ++j)
{
if (a[j] < a[min])
min = j;
}
std::swap(a[i], a[min]);
}
}
沙丘
传说中“伟大的沙丘六部曲”。入手了一套,怀着无比期待和崇高的心情开始阅读。看完了第一部,第二部看了一半,实在看不下去了。
真的是欣赏不了。
啰啰嗦嗦,神神叨叨,故事性又不强,代入感极差。
哈哈,个人观点。不过据说新的沙丘电影快上映了,还是很期待的。
不要推倒重来
摘自《Python基础教程》
虽然这里提倡使用原型,但务必对推倒重来持谨慎态度,在你为编写原型投入了不少时间和精力时尤其如此。更好的选择可能是,对原型进行重构和修改,让其变成功能上更好的系统,其原因有多个。
一个可能出现的常见问题是“第二系统综合征”,即力图让第二个版本非常灵巧或完美无缺,导致永远没有完工的时候。
“不断重写综合征”在小说创作领域很常见,指的是不断地修改程序,甚至推倒重来。在有些情况下,让程序“还行”可能是最佳的策略——管用就好。
还有“代码疲劳症”,即你对代码逐渐感到厌烦。你花了很长时间来编写代码,却发现它丑陋而笨拙。导致代码看起来粗糙而笨拙的原因之一是,必须处理各种特殊情况并包含多种形式的错误处理等。无论如何,在新版本中也必须包含这些功能,而最初为了实现它们,你可能花了很大的精力(更别说为调试花费的精力了)。
换而言之,如果你觉得原型还有得救,能变成可行的系统,就应竭尽所能地修改它,而不是推倒重来。在本书后面关于开发项目的章节中,我将开发成果分成了界线清晰的两个版本:原型和最终程序。这样做既是出于清晰考虑,也是为了突出通过编写软件的第一个版本获得的经验和洞察力。在实际开发工作中,完全可以先开发原型,再通过重构它来获得最终的系统。
要深入地了解推倒重来的恐怖之处,请参阅Joel Spolsky撰写的文章“Things You Should Never Do, Part I”(joelonsoftware.com)。据Spolsky讲,对所有软件公司来说,推倒重来都是最严重的策略性错误。
换了新的博客系统
SDL 笔记
开发环境配置
http://tjumyk.github.io/sdl-tutorial-cn/contents.html
VS 新建项目选择控制台程序,链接属性中选择子系统“/SUBSYSTEM:WINDOWS”。
在屏幕上显示一张图片
#include <SDL/SDL.h>
int main(int argc, char *args[])
{
SDL_Surface *hello = nullptr;
SDL_Surface *screen = nullptr;
SDL_Init(SDL_INIT_EVERYTHING);
// 设置窗口
screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);
// 加载图像
hello = SDL_LoadBMP("hello.bmp");
// 将图像应用到窗口上
SDL_BlitSurface(hello, nullptr, screen, nullptr);
// 更新窗口
SDL_Flip(screen);
SDL_Delay(2000);
// 释放资源
SDL_FreeSurface(hello);
SDL_Quit();
return 0;
}
敏捷软件开发,可持续的开发速度
以下摘自《敏捷软件开发:原则、模式与实践》。
可持续的开发速度:
软件项目不是全速短跑,它是马拉松长跑。那些一跃过起跑线就开始尽力狂奔的团队将会在远离终点前就筋疲力尽。为了快速地完成开发,团队必须要以一种可持续的速度前进。团队必须保持旺盛的精力和敏锐的警觉。团队必须要有意识地保持稳定、适中的速度。
XP(极限编程)的规则不允许团队加班工作。在版本发布前的一个星期是该规则的唯一例外。如果发布目标就在眼前并且能够一蹴而就,则允许加班。
人月神话,外科手术队伍
以下摘自《人月神话》,讨论了开发团队的组建以及运作。
在计算机领域的会议中,常常听到年轻的软件经理声称,他们喜欢由一流人才组成的小型、精干的队伍,而不是那些几百人的大型团队,这里的“人”当然暗指平庸的程序员。其实我们也经常有相同的看法。
软件经理很早就认识到优秀程序员和较差程序员之间生产率的差异。
我常常重复这样一个观点,需要协作沟通的人员数量影响着开发成本,因为成本的主要组成部分是相互的沟通和交流,以及更正沟通不当引起的不良结果(系统调试)。这一点,也暗示系统应该由尽可能少的人员来开发。
如果在一个200人的项目中,有25个最能干和最有开发经验的项目经理,那么开除剩下的175名程序员,让项目经理来编程开发。
Cg教程:可编程实时图形权威指南
Shader - 着色器,是可以在GPU上运行的程序,分为顶点着色器和片段着色器(像素着色器)。
编写Shader的编程语言主要有三种:
- GLSL - 用于OpenGL
- HLSL - 用于Direct3D
- Cg - 微软和NVIDIA合作开发的,可用于OpenGL和Direct3D