/*算法导论之001插入排序
插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。
*/
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void InsertSort(int *pnArr, int nLen)/*插入排序*/
{
if (pnArr == NULL || nLen == 0)/*判断是否为空*/
{
return;
}
for (int i = 1; i < nLen; i++)
{
int nTmp = pnArr[i]; /*从第二个数据开始*/
int j; /*记录到第几个数了*/
for (j = i; j>0 && nTmp<pnArr[j - 1]; j--) /*进来一个数,插入到已经排序的数据中*/
{
pnArr[j] = pnArr[j - 1];
}
pnArr[j] = nTmp;
}
}
void PrintArr(int *pnArr, int nLen)/*输出函数*/
{
for (int i = 0; i < nLen; i++)
{
printf("%5d", pnArr[i]);
}
printf("\n");
}
int main()
{
// srand(time(NULL));
int nArr[10] = {1,2,3,45,7,2,3,9,0,6};
for (int i = 0; i < 10; i++)
{
/*nArr[i] = rand() % 100;//*/
}
printf("排序前:");
PrintArr(nArr, 10);
InsertSort(nArr, 10);
printf("排序后:");
PrintArr(nArr, 10);
system("pause");
return 0;
}
srand()函数:
void srand(unsigned seed) 初始化随机数发生器
有讨论如下:
C的函数库之所以没有把使用系统时钟初始化随机种子这步重要的操作直接放进rand函数的实现中,
至少有三个原因:
(1)可以高效产生连续的随机数,不用每次都初始化;
(2)给程序员以更高的灵活性,因为可能在要求较高的场合,应该使用更好的的数据做种子,而不是系统时钟;
(3)对于只是想产生大量伪随机数来尽兴某种验证或者统计,未必需要初始化,大不了程序每次运行都产生同
样的一系列随机数而已——有些情况下,这是无所谓的。
事实上有一个更重要的原因:
作为伪随机序列产生器的rand()函数,必须具备的一个重要特性就是-》产生的序列必须是可重现的。
这不仅仅是一个算法,相当大的程度上,它关系到代码测试的准确性。如果算法中使用了和rand()的结果
相关的数据,通过一个可控的可重现序列,我们就有机会再现每一次测试的过程,从而更有效的找到问题的所在。
c语言里函数rand()和srand()的用法 - -
所以这里提出一个建议,代码中,如果rand()的函数结果关系到算法的结果,那么,必须保证你的rand()调用是可重现的。
rand(void)用于产生一个伪随机unsigned int 整数。
srand(seed)用于给rand()函数设定种子。
srand 和 rand 应该组和使用。一般来说,srand 是对 rand 进行设置。
比如:
srand((UINT)GetCurrentTime());
int x = rand() % 100;
是生成 0 到 100 之间的随机数。
srand()是用来初始化随机种子数的,因为rand的内部实现是用线性同余法做的,他不是真的随机数,
只不过是因为其周期特别长,所以有一定的范围里可看成是随机的,式子如下:
rand = rand*const_1 + c_var;
srand函数就是给它的第一个rand值。
用"int x = rand() % 100;"来生成 0 到 100 之间的随机数这种方法是不或取的,
比较好的做法是: j=(int)(n*rand()/(RAND_MAX+1.0)) 产生一个0到n之间的随机数
总结:
1)srand()给rand()提供种子
2)srand()中的seed一般由时间函数得,eg srand((UINT)GetCurrentTime()) srand( (unsigned)time( NULL ) ) time()函数得到现在的系统时间...等等
/*算法导论之001插入排序
插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。
*/
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void InsertSort(int *pnArr, int nLen)/*插入排序*/
{
if (pnArr == NULL || nLen == 0)/*判断是否为空*/
{
return;
}
for (int i = 1; i < nLen; i++)
{
int nTmp = pnArr[i]; /*从第二个数据开始*/
int j; /*记录到第几个数了*/
for (j = i; j>0 && nTmp<pnArr[j - 1]; j--) /*进来一个数,插入到已经排序的数据中*/
{
pnArr[j] = pnArr[j - 1];
}
pnArr[j] = nTmp;
}
}
void PrintArr(int *pnArr, int nLen)/*输出函数*/
{
for (int i = 0; i < nLen; i++)
{
printf("%5d", pnArr[i]);
}
printf("\n");
}
int main()
{
// srand(time(NULL));
int nArr[10] = {1,2,3,45,7,2,3,9,0,6};
for (int i = 0; i < 10; i++)
{
/*nArr[i] = rand() % 100;//*/
}
printf("排序前:");
PrintArr(nArr, 10);
InsertSort(nArr, 10);
printf("排序后:");
PrintArr(nArr, 10);
system("pause");
return 0;
}
void srand(unsigned seed) 初始化随机数发生器
有讨论如下:
C的函数库之所以没有把使用系统时钟初始化随机种子这步重要的操作直接放进rand函数的实现中,
至少有三个原因:
(1)可以高效产生连续的随机数,不用每次都初始化;
(2)给程序员以更高的灵活性,因为可能在要求较高的场合,应该使用更好的的数据做种子,而不是系统时钟;
(3)对于只是想产生大量伪随机数来尽兴某种验证或者统计,未必需要初始化,大不了程序每次运行都产生同
样的一系列随机数而已——有些情况下,这是无所谓的。
事实上有一个更重要的原因:
作为伪随机序列产生器的rand()函数,必须具备的一个重要特性就是-》产生的序列必须是可重现的。
这不仅仅是一个算法,相当大的程度上,它关系到代码测试的准确性。如果算法中使用了和rand()的结果
相关的数据,通过一个可控的可重现序列,我们就有机会再现每一次测试的过程,从而更有效的找到问题的所在。
所以这里提出一个建议,代码中,如果rand()的函数结果关系到算法的结果,那么,必须保证你的rand()调用是可重现的。
rand(void)用于产生一个伪随机unsigned int 整数。
srand(seed)用于给rand()函数设定种子。
srand 和 rand 应该组和使用。一般来说,srand 是对 rand 进行设置。
比如:
srand((UINT)GetCurrentTime());
int x = rand() % 100;
是生成 0 到 100 之间的随机数。
srand()是用来初始化随机种子数的,因为rand的内部实现是用线性同余法做的,他不是真的随机数,
只不过是因为其周期特别长,所以有一定的范围里可看成是随机的,式子如下:
rand = rand*const_1 + c_var;
srand函数就是给它的第一个rand值。
用"int x = rand() % 100;"来生成 0 到 100 之间的随机数这种方法是不或取的,
比较好的做法是: j=(int)(n*rand()/(RAND_MAX+1.0)) 产生一个0到n之间的随机数
1)srand()给rand()提供种子