avatar

随机函数与快速排序函数

随机函数

time()

返回系统时间,而且其值随着时间比那花而变化

返回值的类型名是time_t

接受一个类型为time_t对象的地址,也可以传入空指针

time(0)

1
2
time_t t;
time(&t);

srand()

重置种子函数

srand((unsigned int) time(&t))

rand()

伪随机函数,配合srand使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
int i, n;
time_t t;

n = 5;

/* 初始化随机数发生器 */
srand((unsigned) time(&t));

/* 输出 0 到 49 之间的 5 个随机数 */
for( i = 0 ; i < n ; i++ ) {
printf("%d\n", rand() % 50);
}

return(0);
}

快速排序函数

函数原型

void qsort(void base, size_t nmemb, size_t size, int (compar)(const void *, const void *))

第一个参数:指向待排序数组的首元素的指针

第二个参数:待排序项的数量

第三个参数:因为使用的是void的指针,所以函数需要知道数组中每个元素的大小

第四个参数:指向比较函数的指针

关于void强制转换的说明

ANSI C 允许把任何类型的指针强制转换成指向void的指针;

但是C++要求再把void*指针赋给任何类型的指针时必须进行强制类型转换,C没有这样的要求。

关于比较函数的说明

该函数接受两个参数,分别指向代比较两项的指针。

如果第1项的值大于第2项,比较函数返回正数;

如果两项相等,则返回0;

如果第1项的值小于第2项,比较函数返回负数;

注意点:为了比较指针所指向的值,必须解引用指针。因为值是指定类型(此处为int),所以要把指针解引用为int类型的值。然而qsort()要求指针指向void。

要解决这个问题,必须在比较函数内部声明两个类型正确的指针,并初始化他们分别指向作为参数传入的值。

使用示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NUM 100

int mycomp(const void * p1, const void * p2);
void showarray(int * pt, int n);

int main()
{
int i;
time_t t;
int *pt = (int *) malloc(NUM * sizeof(int));

/* 初始化随机数发生器 */
srand((unsigned) time(&t));

/* 初始化数组 */
for( i = 0 ; i < NUM ; i++ ) {
*(pt+i) = rand() % NUM + 1;
}

/* 展示排序前数组 */
showarray(pt, NUM);

/* 快速排序 */
qsort(pt, NUM, sizeof(int), mycomp);

printf("********************\n");

/* 展示排序后的数组 */
showarray(pt, NUM);

free(pt);
return(0);
}

int mycomp(const void * p1, const void * p2)
{

const int * a1 = (const int *) p1;
const int * a2 = (const int *) p2;

if(*a1 < *a2)
return -1;
else if (*a1 == *a2)
return 0;
else
return 1;
}

void showarray(int * pt, int n)
{
int i;
for(i = 0; i < n; i++)
{
printf("%5d", *(pt+i));
if((i+1) % 10 == 0)
printf("\n");
}
}
文章作者: Gy
文章链接: http://sgyat.cn/2021/03/15/C杂记2/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 年轻没有梦
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论