求第K大源码

来源:互联网 发布:2017龙年快乐最新域名 编辑:程序博客网 时间:2024/04/28 03:40
#include <stdio.h>
#include <time.h>
#include <stdlib.h>


#define SWAP(A,B) {int t; t = (A); (A) = (B); (B) =t;}

int kbig(int number[], int left, int right, int k);

int partition(int number[], int left, int right);
void quicksort_m(int number[], int left, int right);
void quicksort(int number[], int left, int right);

int main(int argc, char* argv[]){

    int i = 0;
    int number[100];
    srand(time(NULL));
    for( i = 0; i< 100; i++)
    {
        number[i] = rand() % 100;
        printf("%d,", number[i]);
    }
    printf("\n\n");
    kbig(number, 0, 99, 10);
    for(i = 0 ; i<100; i++ )
        printf("%d,", number[i]);


    quicksort(number, 0, 99);
    printf("\n\n");
    for( i = 0; i< 100; i++)
    {
        printf("%d,", number[i]);
    }
    getchar();
    return 0;
}



int partition(int number[], int left, int right){
    int i,j ,s;
    
        i = left -1;
        j = right +1;
        SWAP(number[left], number[(left+right)/2]);
        s = number[left];
        while(1){
            while( number[++i] < s);
            while( number[--j] > s);
            if( i >= j )
                break;
            SWAP(number[i], number[j]);
        }
        number[left] = number[j];
        number[j] = s;
    return j;
}

int kbig(int number[], int left, int right, int k){
    int count = 0;
    if(right - left <= k)
        return left;
    count = partition(number,left,right);
    if( right - count > k)
        kbig(number, count+1,right,k);
    else if( right - count < k)
        kbig(number, left,count -1, k-right+count);
    else
        return count;
}

void quicksort(int number[], int left, int right){
    int j;
    if(left < right){
        j = partition(number,left,right);
        quicksort(number, left, j-1);
        quicksort(number, j+1, right);        
    }
}
void quicksort_m(int number[], int left, int right)
{
    int i, j, s;
    if(left < right){
        i = left-1;
        j = right+1;
        SWAP(number[left], number[(left+right)/2]);
        s = number[left];

        while(1){
            while( number[++i] < s);
            while( number[--j] > s);
            if( i >= j)
                break;
            SWAP(number[i], number[j]);
        }
        number[left] = number[j];
        number[j] = s;        
        quicksort_m(number, left, j-1);
        quicksort_m(number, j+1, right);
    }
}
原创粉丝点击