xyjzsh

插入排序vs希尔排序

什么是插入排序?
在插入排序法中,将检查数组中的每个元素,将它插入排序中的元素的适当位置,当最后一个元素插入到它适当的位置时,这个数组就排好序了。例如,

假如我们要对一个有5个元素的数组进行升序排列,假设第一个元素的值被假定为已排好序了,那么我们将第2个元素插入到已排序好的数组中的适当位置上,使得数组应该是排序好的。依次类推,将第3个插入到到已排序好的数组中的适当位置,使得插入后数组仍然是排序好的,。。。。。。
下面是一个插入排序的Demo:
int tarArr[]={10,1,35,12,7,17,66,6,56,26};
int size = sizeof(tarArr)/sizeof(tarArr[0]);

void insertSort(void)
{
    
int i=0,j=0;
    
for(i=1;i<size;i++)
    
{
        
int nextValue = tarArr[i];
        
for(j=i-1;j>=0;j--)
        
{
            
if(nextValue<tarArr[j])
                tarArr[j
+1]=tarArr[j];
            
else
            
{
                
break;
            }

        }

        tarArr[j
+1]=nextValue;
    }

}

下面来介绍一下希尔排序:
希尔排序就是将要排序的数据先分成如果组,对每一组实行插入排序。
代码如下:
int tarArr[]={10,1,35,12,7,17,66,6,56,26};
int size = sizeof(tarArr)/sizeof(tarArr[0]);

void shellSort(void)
{
    
int gap =0,i=0,j=0;
    
for(gap = size/2;gap>0;gap/=2)
    
{
        
for(i=gap;i<size;i+=gap)
        
{
            
int nextValue = tarArr[i];
            
for(j=i-gap;j>=0;j-=gap)
            
{
                
if(nextValue<tarArr[j])
                    tarArr[j
+gap] = tarArr[j];
                
else
                
{
                    
break;
                }


            }

            tarArr[j
+gap] = nextValue;
        }

    }

}

posted @ 2011-02-23 17:44 呆人 阅读(326) | 评论 (0)编辑 收藏

通过函数参数的类型推导模板版本

模板函数如下:
template<class T>
T max(T x, T y)
{
   return x>y ? x:y;
}

void testMax(void)
{
    max(1,2);//因为两个参数都是int型,所以编译器会根据参数而推导出使用max<int>这个版本
    max(1.2,3.4);//通过两个参数都为double型,推导出使用max<double>这个版本
    max('a',12);//会出现编译错误,因为两个参数,一个为char ,另一个为int ,所以编译器无法根据类型推导出使用哪一个版本
    //可以通过显示的制定使用哪个版本,从而解决这个问题
    max<int>('a',12);
}

posted @ 2011-02-23 11:13 呆人 阅读(439) | 评论 (0)编辑 收藏

2010年总结——关于技术和生活

技术书:
1.《c++程序设计语言》——c++的老爹的大作。读了第一部分和第二部分。关于STL的所有内容掠过。
2.《Sqlite》——嵌入式关系数据库的介绍,对理解关系数据库很有帮助。本来想研究一下sqlite的源代码,我发现我水平有限,还没那水平,但愿有一天我这美好的愿望能实现。
3.《算法导论》。买这本书是因为我对KMP算法的费解。不过我觉得这本书写的很不错,数据结构和基本算法写的都不错。
4.《win32多线程程序设计》还没读完,明年希望结合这本书写个线程池出来。
5.《Inside the c++ object model》解释c++的底层实现,对c++功底要求高,我只懂了部分内容,不过对virtual function的理解很有帮助。
6.《Effective c++》更适合c++初学者的书。很不错。
7.《你的灯还亮着吗》关于程序员。

其他书:
1.《苏菲的世界》哲学入门书,很有意思的一本书。
2.《荷包里的单人床》——张小娴,关于女人和爱情。
3.《目送》——龙应台,关于亲情和无奈。感动。
4.《活着》——余华,关于生活与活着,一本让我泪流满面的书。
5.《与众不同的心理学》很有道理的一本书,印象最深的是:人们相信星座,是因为把大众的东西个性化啦!我觉得很有道理。

广播剧:致我们终将失去的青春。在此列出是因为我是如此的喜欢这部广播剧。以至于我觉得它是值得我记住的。

2010年还是有收获的一年,毕业工作。平静也算充实。但是还有很多做得不够,不够淡定,容易被琐碎的事心烦。2011年不再浮华,努力学习!好好工作!!

2011年要做得事情还有很多。
要看的技术书:
1.《泛型编程和STL》
2.《编程之美》
3.《win32程序设计》+线程池模型程序代码
4.《大话设计模式》
5.《Domain-Driven Design》
要看一下经济类的书

要看的其他书:
1.《穆斯林的葬礼》
2.张小娴散文集

要去报个英语口语班,英语学习不能怠慢啊,否则英语会废掉的。

2010年还剩没几天啦,开开心心的回家过春节!!好好休息一下,2011年希望自己天天开心,日子过得充实!!多读书读好书!!加油!!

posted @ 2011-01-27 17:11 呆人 阅读(213) | 评论 (0)编辑 收藏

Effective C++书评

笔者c++的经验:半年的c++开发经验。
相比于前些日子读的《深入探索c++对象模型》,这本书更适合于初学者。侯捷老师翻译的清晰流畅。
本书有9章共55个item。
本书的前四章,个人认为对于有一定c++基础的人来说都会受益匪浅。告诉了你很多的编程习惯。好的编程习惯是程序健壮性的一个重要保障。
书中不仅告诉你怎么样做,还告诉你为什么这样做,这让我突然想起来以前的老大跟我说的话,不仅要知道how,还要知道why。这本书会告诉你why。
很多事情知道了why,how就会很好理解。

第五章因为牵涉到异常的处理,我对c++的异常不是很了解,还要差更多的资料再来读第五章。第五章只是大略看了一下。

第六章继承和面向对象设计。
我觉得读这章更适合于设计,大型项目的时候用的多一些,对于平时写点儿小程序,貌似是用不到,不过他对于public继承和private继承的描述还是让人有种恍然大明白的感觉。(*^__^*) 嘻嘻……

第七章 模板与泛型编程
本章打算与侯捷老师的佳作《泛型编程与STL》结合看。书已经买到啦,春节回来继续努力~\(≧▽≦)/~啦啦啦。

第八章第九章
大略看了一下。不发表意见啦。

posted @ 2011-01-27 16:08 呆人 阅读(291) | 评论 (0)编辑 收藏

[算法题]输出从1到1000的数[转载]

有这样一个面试题——请把从1到1000的数打印出来,但你不能使用任何的循环语句或是条件语句。更不能写1000个printf或是cout用C/C++语言

个人比较赞赏的思路是下面两个:

1. 函数指针数组结合n/1000的结果作为数组的index。

 1void yesprint(int i);
 2void noprint(int i);
 3 
 4typedef void(*fnPtr)(int);
 5fnPtr dispatch[] = { yesprint, noprint };
 6 
 7void yesprint(int i) {
 8    printf("%d\n", i);
 9    dispatch[i / 1000](i + 1);
10}

11 
12void noprint(int i) /* do nothing. */ }
13 
14int main() {
15      yesprint(1);
16}

17

2. 构造函数结合静态变量结合数组。

 1 class Printer
 2 {
 3 public:
 4     Printer() { static unsigned i=1; cout << i++ << endl;; }
 5  
 6 };
 7  
 8 int main()
 9 {
10     Printer p[1000];
11 }
12 

posted @ 2011-01-17 10:30 呆人 阅读(342) | 评论 (0)编辑 收藏

深入探索C++对象模型

     对于有半年c++学习经验的我看这本书的时候确实挺吃力的,不过也正是因为很多地方不懂,所以在看这本书的时候查了很多资料,有了更多的收获。
      首先是看不懂的地方:对于虚拟继承和多重继承的内容,我只是浏览了一下,因为我的能力实在是看不了这两部分的内容。
      
      我之所以看这本书,是源于我对一个问题很纠结:这个问题是:指向类成员函数的指针的问题。这个问题让我很纠结,可是这本书对这个问题讲解的确实很透彻(第四章是对这个问题的讲解)。
      这本书让我印象最深的是对于多态的实现(动态绑定)的讲解。virtual table的使用。通过它让我对于继承、多态有了更深刻的了解。
      
      这本书中有很多的图表用来表示class object的结构,清晰明了。值得一看!

      这本书看完后,有收获,但是离吃透这本书还差的远,我还要继续努力!差距还是很大滴,继续努力!!

posted @ 2011-01-11 17:15 呆人 阅读(322) | 评论 (0)编辑 收藏

使用位

 1 #include<windows.h>
 2 #pragma pack(push,1)
 3 typedef    struct    tagBite
 4 {
 5     UINT    bite3:8;
 6     UINT    bite2:8;
 7     UINT    bite1:8;
 8     UINT    bite0:8;
 9 }HBITE,*PHBITE;
10 typedef    union    tagDData
11 {
12     DWORD    dword;
13     BYTE    byte[4];
14     HBITE    bite;
15 }DDATA,*PDDATA;
16 #pragma pack(pop)
测试
 1void testBite()
 2{
 3    PHBITE pHbite = new HBITE;
 4    pHbite->bite0 =0;
 5    pHbite->bite1 =0;
 6    pHbite->bite2 =1;
 7    pHbite->bite3 =1;
 8
 9    UINT *pData = (UINT*)pHbite;
10    printf("data=%d\n",*pData);
11
12    HBITE hBite;
13    UINT uData=10;
14    memcpy(&hBite,&uData,sizeof(uData));
15
16    printf("hBite.bite3=%d,hBite.bite2=%d\n",hBite.bite3,hBite.bite2);
17}

posted @ 2011-01-04 14:15 呆人 阅读(309) | 评论 (0)编辑 收藏

适合于网络传输的一种数据结构

在网络传输中要传输的数据往往是不定长的,一般我们可以分配足够的空间,使用某个字段用于记录传输的数据的长度。然后对数据压缩后再进行传输。

定义数据结构
typedef struct tagTransferData
{
   ///一些其他信息////
   DWORD dataSize;
   char buffer[1];//定义一个可变长度的数组
}Data,*PData;
使用:
PData pData = (PData)malloc(10000);
memset(pData,0,10000);
。。。。。。。。。
char sendData[]="good morning everyone!";
strcpy(pData->buffer,sendData);
pData->dataSizse = strlen(sendData);
。。。。。。。。。
delete pData;

该数据结构:对于一块内存,开始记录了后面要传输数据的大小,紧接着是要传输的数据。是的数据比较紧凑,易于管理。
个人认为:分配的多余的空间使用数据压缩后,不会导致传输太多的无用数据。

posted @ 2010-12-21 10:45 呆人 阅读(548) | 评论 (1)编辑 收藏

WSAStartup函数的使用

int WSAStartup(
__in          WORD wVersionRequested,
__out         LPWSADATA lpWSAData
);

WSAStartup

  式: int PASCAL FAR WSAStartup( WORD wVersionRequested,  LPWSADATA lpWSAData );

  数:  wVersionRequested 欲使用的 Windows Sockets API 版本

lpWSAData  指向 WSADATA 资料的指标

传回值:  成功 – 0

           失败 - WSASYSNOTREADY / WSAVERNOTSUPPORTED /  WSAEINVAL

说明: 此函式「必须」是应用程式呼叫到 Windows Sockets DLL 函式中的第一个,也唯有此函式呼叫成功後,才可以再呼叫其他 Windows  Sockets DLL 的函式。此函式亦让使用者可以指定要使用的 Windows Sockets API 版本,及获取设计者的一些资讯。程式中我们要用 Winsock 1.1,所以我们在程式中有一段为:

WSAStartup((WORD)((1<<8)|1),(LPWSADATA) &WSAData)

其中 ((WORD)((1<<8)|1) 表示我们要用的是 Winsock 1.1」版本,而WSAData 则是用来储存由系统传回的一些有关此一 Winsock Stack 的资料。

The WSAStartup function initiates use of the Winsock DLL by a process.










在使用WSAStartup的使用出现了下面的问题:

源码:
#include "stdafx.h"
#include
<windows.h>

int main()
{
    WSADATA wsa
={0};
    WSAStartup(MAKEWORD(
2,2),&wsa);
    
    
return 0;
}
出现的错误信息:
错误 1 error LNK2019: 无法解析的外部符号 _WSAStartup@8,该符号在函数 _main 中被引用 CompletePortDemo.obj CompletePortDemo
解决方法:添加#pragma comment(lib,"ws2_32.lib")
正确代码:
#include "stdafx.h"
#include
<windows.h>
#pragma    comment(lib,
"ws2_32.lib")

int main()
{
    WSADATA wsa
={0};
    WSAStartup(MAKEWORD(
2,2),&wsa);
    
    
return 0;
}

posted @ 2010-12-17 14:47 呆人 阅读(4084) | 评论 (0)编辑 收藏

vs2008只生成dll,没有生成lib的解决方案

原因缺少.def文件。
在项目中添加一个def文件。eg. test.def.
然后
项目属性->链接器->输入->模块定义文件->在里面添上test.def即可解决问题

posted @ 2010-12-15 17:48 呆人 阅读(3720) | 评论 (1)编辑 收藏

仅列出标题
共6页: 1 2 3 4 5 6 
<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

导航

统计

常用链接

留言簿(1)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜