2. leetcode 之數組中的第K個最大元素 快速排序

Table of Contents

1. 題目描述:

2. 解題思路:

3. 知識點總結:


1. 題目描述:

在未排序的數組中找到第 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
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

2. 解題思路:
 

最開始比較笨的解題思路, 冒泡排序+數組定位:

int findKthLargest(int* nums, int numsSize, int k){
    int i, j, temp;

    for (i = 0; i<k; i++){
        for(j=i+1; j<numsSize; j++){
            if (nums[i] < nums[j]){
                temp = nums[i];
                nums[i] = nums[j];
                nums[j] = temp;
            }
        }
    }
    return nums[k-1];
}

考慮用快速排序優化後的解題思路及代碼:

int compare_data(const void *a, const void *b){
    return *(int *)b - *(int *)a;
}
int findKthLargest(int* nums, int numsSize, int k){
    qsort(nums, numsSize, sizeof(int), compare_data);

    return nums[k-1];
}

以上是用快排的庫函數實現的, 後續需要自己實現快排算法.

3. 知識點總結:

reference:  https://www.cnblogs.com/laizhenghong2012/p/8442270.html
核心: 快速排序 qsort接口函數:
qsort()
函數原型

void qsort(
void *base,
size_t nmemb,
size_t size,
int (*compar)(const void *, const void *)
);

函數功能:qsort()函數的功能是對數組進行排序,數組有nmemb個元素,每個元素大小爲size。

參數base - base指向數組的起始地址,通常該位置傳入的是一個數組名
參數nmemb - nmemb表示該數組的元素個數
參數size - size表示該數組中每個元素的大小(字節數)
參數(*compar)(const void *, const void *) - 此爲指向比較函數的函數指針,決定了排序的順序。

比較函數的接口實現, 這個可以背下, 改變a-b的順序, 可以改變排序的大小順序.
int compare_data(const void *a, const void *b){
return *(int *)b - *(int *)a;
}

後續: 研究快排原理, 並用代碼實現.

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