C语言|求数组第k大数|partition、优先队列大顶堆

在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

示例 1:

输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2:

输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
说明:

你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

排序

8ms

int cmp(const void*a,const void *b){
    return *(int*)b-*(int*)a;
}

int findKthLargest(int* nums, int numsSize, int k){
    qsort(nums, numsSize, sizeof(int), cmp);
    return nums[k-1];
}

partition思想

8ms

void exchange(int *a, int *b){
    int temp=*a;
    *a=*b;
    *b=temp;
}

int partition(int* nums, int l, int r){
    srand(time(NULL));
    int random=rand()%(r-l+1)+l;
    exchange(&nums[random], &nums[r]);
    int i, j, pivot=nums[r];
    for(i=l-1, j=l; j<=r-1; j++){
        if(nums[j]>=pivot){
            i++;
            exchange(&nums[i], &nums[j]);
        }
    }
    i++;
    exchange(&nums[i], &nums[r]);
    return i;
}
int selection(int *nums, int l, int r, int k){
    int p=partition(nums, l, r);
    int res;
    if(k==p-l+1) res = nums[p];
    else if(k>p-l+1){
        res = selection(nums, p+1, r, k-(p-l+1));
    }
    else{
        res = selection(nums, l, p-1, k);
    }
    return res;
}
int findKthLargest(int* nums, int numsSize, int k){
    return selection(nums, 0, numsSize-1, k);
}

优先队列,大顶堆

8ms 

void exchange(int *a, int *b){
    int temp=*a;
    *a=*b;
    *b=temp;
}

void maxHeapify(int a[], int i, int heapSize){
    int l=2*i+1, r=2*i+2, largest=i;
    if(l<heapSize && a[l]>a[largest]) largest=l;
    if(r<heapSize && a[r]>a[largest]) largest=r;
    if(largest != i){
        exchange(&a[largest], &a[i]);
        maxHeapify(a, largest, heapSize);
    } 
}

void buildMaxHeap(int a[], int Len){
    int i, heapSize=Len;
    for(i=(heapSize-1)/2; i>=0; i--){
        maxHeapify(a, i, heapSize);
    }
}

int findKthLargest(int* nums, int numsSize, int k){
    int res, i, j;
    int *a=(int*)malloc(sizeof(int)*k);
    for(i=0; i<k; i++) a[i]=nums[i];
    buildMaxHeap(a, k);
    for(i=k; i<numsSize; i++){
        if(nums[i]<a[0]){
            a[0]=nums[i];
            maxHeapify(a,0, k);
        }
    }
    return a[0];
}

 

posted @ 2020-10-11 17:25  Eunice呀  阅读(474)  评论(0)    收藏  举报