1. 程式人生 > >選擇問題(selection problem)的程式碼實現

選擇問題(selection problem)的程式碼實現

問題來源於《資料結構與演算法分析-C語言描述》的課後題。

問題描述:設有一組N個數而要確定其中第k個最大者。

解題思路:第一種演算法:將N個數讀入一個數組中,在通過某種簡單的演算法,比如氣泡排序法,以遞減順序將陣列排序,然後返回位置k上的元素。

第二種演算法:把k個元素讀入陣列並(以遞減的順序)對其進行排序。接著,將剩下元素再逐個讀入。當新元素被讀入時,如果它小於陣列中第k個元素則被忽略,否則就將其放入陣列中正確的位置上,同時將陣列中最後一個元素擠出陣列。當演算法終止時,位於第k個位置上的元素作為答案返回。

程式碼實現:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
	int a[10],
		b[10]={0},
		k,
		tem;
	srand((unsigned) time(NULL));<span style="white-space:pre">		</span>
	for(int m=0;m<10;m++)
	{
		a[m]=rand()%100;
		printf("%d ,",a[m]);
	}<span style="white-space:pre">							</span>//生成有十個隨機數的陣列
	printf("\nGive me a K where 0<k<11:\n");
	scanf("%d",&k);
	if(k<0||k>11)
	{
		printf("An illegle k\n");
		return -1;
	}<span style="white-space:pre">							</span>//判斷輸入k值是否有效
	
	for(int i=0;i<10;i++)
	{
		tem=k;
		if(a[i]>b[tem-1])
		{
			b[tem-1]=a[i];
			tem--;
			while(a[i]>b[tem-1]&&tem>0)
			{
				b[tem]=b[tem-1];
				b[tem-1]=a[i];
				tem--;<span style="white-space:pre">				</span>//對前k大元素進行排序
			}
		}
	}
	printf("The Kth maximum value is %d\n",b[k-1]);
}

總結:剛開始學習,程式碼雖然能夠執行得到正確結果,其中肯定存在很多規範性的問題,堅持coding,總有一天能夠寫出高質量的程式碼!

如果有幸有人看我的部落格,如果能給我的程式碼提出一點改進計劃或指出我程式碼中存在的問題,真是感激不盡!