标签:sof 产生 sel 元素 target 指针 apple blank height
本部分内容来自http://www.cnblogs.com/mingc,笔者在此只用于整理学习。
问题描述:编写一个程序解决选择问题。令k=N/2。画出表格显示你的程序对于N为不同值时的运行时间。
理解:设有一组N个数确定其中第k个最大者,称选择问题(selection problem)
思路:读入前k个数到临时数组tmp(并按降序排列)。然后逐个读取后续数字X,当X大于第k个数时,将其加入数组tmp(并按降序排列)。最后返回位置k-1上的值
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 100
int select(int* arr, int n, int k);
void main()
{
int i, value;
int* arr;
clock_t elapse;
srand((unsigned)time(NULL));
arr = (int* )malloc(sizeof(int)* N);
for(i = 0; i < N; i++)
{
arr[i] = rand() % 1000; //产生的随机数限制在1000之内
printf("%d ", arr[i]);
}
printf("\n");
elapse = clock();
value = select(arr, N, N/2);
elapse = clock() - elapse;
printf("Value: %d, elapsed: %.4lfs\n", value, (double)elapse/1000);
system("pause");
}
int select(int* arr, int n, int k)
{
int i, j, t;
int* tmp;
tmp = (int *)malloc(sizeof(int)* k);
for(i = 0; i < k; i++) //读入k个元素并升序排列
{
tmp[i] = arr[i];
for(j = i; j > 0; j--)
{
if(tmp[j] < tmp[j-1])
{
t = tmp[j];
tmp[j] = tmp[j-1];
tmp[j-1] = t;
}
}
}
printf("读入k个元素并升序排列:\n");
for(i = 0; i < k; i++)
{
printf("%d ",tmp[i]);
}
printf("\n");
for(i = k; i<n; i++) //加入新元素并升序排列
{
if(arr[i] > tmp[0])
{
tmp[0] = arr[i];
for(j = 0; j < k-1; j++)
{
if(tmp[j] > tmp[j+1])
{
t = tmp[j];
tmp[j] = tmp[j+1];
tmp[j+1] = t;
}
}
}
}
printf("加入新元素并升序排列:\n");
for(i = 0; i < k; i++)
{
printf("%d ",tmp[i]);
}
printf("\n");
return tmp[k-1];
}
笔记:
1.srand((unsigned)time(NULL));
初始化随机函数种子。srand((unsigned)time(NULL));是拿系统时间作为种子,由于时间是变化的,种子变化,可以产生不相同的随机数。
使用时,参数可以是unsigned型的任意数据,比如srand(10)。
如果不使用srand( ),用rand( )产生的随机数可能是一样的。
2.int* arr;
arr = (int* )malloc(sizeof(int)* N);
使用指针来指向字符串时,必须为其开辟动态空间,否则在为其赋值时,会由于没有分配空间而提示错误。
也可以采用int arr[MAXSIZE];来直接定义数组空间。
标签:sof 产生 sel 元素 target 指针 apple blank height
原文地址:http://www.cnblogs.com/li943838648/p/7509465.html