1. 程式人生 > >【數據結構與算法分析——C語言描述】練習1.1——選擇問題

【數據結構與算法分析——C語言描述】練習1.1——選擇問題

problem 內容 語言 log %d include oid define signed

本部分內容來自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];來直接定義數組空間。

【數據結構與算法分析——C語言描述】練習1.1——選擇問題