제9 장 중위 수 와 순서 통계학의 'i 작은 원소 찾기 (귀속 판) 평균 운행 시간 은 O (n) 알고리즘'

1325 단어
빠 른 정렬 과 같은 에 세이 화 버 전 이지 만, 여 기 는 매번 구 분 된 쪽 만 처리 합 니 다.최 악의 경우 시간 복잡 도 는 O (n ^ 2) 로 매번 최대 구간 에 따라 구분 된다.그러나 평균 상황 에서 모든 순서 통 계량 (특히 중위 수) 은 선형 시간 내 에 얻 을 수 있 고 시간 복잡 도 는 O (n) 이다.
#include <string.h>
#include <time.h>

#define BUFFER_SIZE 10

int RandomizedPartition(int *a,int p,int r)
{
	int i=0;
	int j=0;
	int tmp=0;
	int x=0;
	
	srand((unsigned)time(NULL));
	i=rand()%(r-p+1)+p;
	tmp=a[i];
	a[i]=a[r];
	a[r]=tmp;
	x=a[r];
	
	i=p-1;
	for(j=p;j<r;j++)
	{
		if(a[j]<=x)
		{
			i++;
			tmp=a[i];
			a[i]=a[j];
			a[j]=tmp;
		}
	}
	i++;
	tmp=a[i];
	a[i]=a[r];
	a[r]=tmp;
	
	return i;
}

int RandomizedSelect(int *a,int p,int r,int i)
{
	int q=0;
	int k=0;
	
	if(p==r)
	{
		return a[p];
	}
	
	q=RandomizedPartition(a,p,r);
	
	k=q-p+1;
	
	if(k==i)
	{
		return a[q];
	}
	else if(i<k)
	{
		return RandomizedSelect(a,p,q-1,i);
	}
	else
	{
		return RandomizedSelect(a,q+1,r,i-k);
	}
}

int main()
{
	int i=0;
	int j=0;
	int a[BUFFER_SIZE];
	printf("       :
"); srand((unsigned)time(NULL)); for(i=0;i<BUFFER_SIZE;i++) { a[i]=rand()%100;// printf("%d ",a[i]); } printf("
"); i=BUFFER_SIZE/2; j=RandomizedSelect(a,0,BUFFER_SIZE-1,i); printf(" i=%d :%d
",i,j); system("pause"); return 0; }

좋은 웹페이지 즐겨찾기