Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4826854
  • 博文数量: 930
  • 博客积分: 12070
  • 博客等级: 上将
  • 技术积分: 11448
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 16:57
文章分类

全部博文(930)

文章存档

2011年(60)

2010年(220)

2009年(371)

2008年(279)

分类: LINUX

2009-07-16 22:42:58

   写一段程序,找出数组中第k大的数,输出数所在的位置。例如{24347}中,第一大的数是7,位置在4。第二大、第三大的数都是4,位置在13随便输出哪一个均可。
函数接口为:int find_orderk(const int* narry,const int n,const int k)
 
   求第k大的数其实大家首先想到的肯定是heap排序,就是先对k个大树排序,然后在遍历原数组...但是这样位置就不好处理,我这里想的是快速排序,这样第一次排好序后,就可以求出任意大的数以及其原来的位置了.一家之言.不求大同...
      主要就是附加了一个SEQ数组来表示位置,我先还想到把原来的位置和值弄成一个struct....
其实觉得BT点的就是在数不太大的情况下把高几位用于记录原先的位置,快排比较的时候取余就可以了.好了,不废话了
 

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

#define MAX_NUMS 20
#define MAX_VAL 100

int SEQ[MAX_NUMS];

void init_seq()
{
    int i = 0;
    for(;i<MAX_NUMS;i++)
     {
       SEQ[i] = i+1;
      }
 }
 
int getrandval()
{
   return rand()%MAX_VAL+1;
 }

void swap(int* a, int* b)
{
   int tmp = *a;
   *a = *b;
   *b = tmp;
 }
 
int quickpartition(int A[], int start, int end)
{
   int j = start;
   int i = start-1;
   int x;
   
   x = A[end];
   for(;j<end;j++)
    {
      if(A[j]<x)
       {
         i++;
         swap(A+i,A+j);
         swap(SEQ+i,SEQ+j);
        }
     }
   swap(A+i+1,A+end);
   swap(SEQ+i+1,SEQ+end);
  
  return i+1;
}

int quicksort(int A[], int start, int end)
{
  int q = 0;
  if(start<end)
   {
     q = quickpartition( A, start, end);
     quicksort( A, start, q-1);
     quicksort( A, q+1, end);
    }
}

int printf_arrray(int A[])
{
  int i = 0;
  for(;i<MAX_NUMS;i++)
   {
     if((i+1)%10==0)
      printf("%d\n",A[i]);
     else
      printf("%d\t",A[i]);
    }
}
   
int main(int argc, char *argv[])
{
  int i = 0;
  int A[MAX_NUMS];
  int k = 0;
  srand((unsigned)time(NULL));
  init_seq();
  
  for(;i<MAX_NUMS;i++)
   {
     A[i] = getrandval();
    }
  printf("before quick sort:\n");
  printf_arrray(A);
  quicksort(A, 0, MAX_NUMS-1);
  printf("after quick sort:\n");
  printf_arrray(A);
  
  k = rand()%MAX_NUMS;
  printf("the %d larger num is %d and the seq is %d\n", k+1, A[k], SEQ[k]);
  system("PAUSE");    
  return 0;
}

阅读(1168) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~