算法導論之選取第j小的元素

// RandomizedSelect.cpp : Defines the entry point for the console application.
//

#include <stdafx.h>
#include <stdlib.h>
#include <time.h>

#define MAX 1000

int Partition( int a[], int p, int r )
{
 int i = p-1;
 while(p != r)
 {
  if(a[p]>a[r])
  {
   i++;
   int temp = a[i];
   a[i]= a[p];
   a[p] = temp;
  }
  p++;
 }
 int temp = a[i+1];
 a[i+1] = a[r];
 a[r] = temp;
 return i+1;
}

int RandomizedPartition( int a[], int p, int r )
{
 int i = rand()%(r-p) + p;
 int temp = a[r];
 a[r] = a[i];
 a[i] = temp;
 return Partition(a, p, r);
}

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

int main(int argc, char* argv[])
{
 puts("please input the scale of data:");
 int length = 0;
 scanf("%d", &length);
 int* a = (int *)malloc(length * sizeof(int));
 srand(time(0));
 int i=0;
 puts("the array is:");
 for(;i<length;i++)
 {
  a[i] = rand()%MAX;
  printf("%d ", a[i]);
 }
 puts("\nplease input j:");
 int j=0;
 scanf("%d", &j);
 j = RandomizedSelect(a, 0, length-1, j);
 printf("%d", j);
 return 0;
}

 

問題:

1、其實這個算法沒有什麼問題啦,比較簡單的,並且大師的書就是大師,很容易實現,基本上把代碼敲上就搞定!

2、有空自己得再好好看看,爭取一遍不看書,直接搞定。

3、有些小細節得注意,下標要特別注意~~~

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章