文章目錄
1. qsort函數原型
2. compar參數
3. int 數組排序
4. 結構體排序
5. 字元串指針數組排序
6. 字元串二維數組排序
7. qsort函數應用:整型二維數組
頭檔案:<stdlib.h>
函數功能:qsort()函數的功能是對數組進行排序,數組有nmemb個元素,每個元素大小為size。
參數base : base指向數組的起始位址,通常該位置傳入的是一個數組名。
參數nmemb :nmemb表示該數組的元素個數
參數size :size表示該數組中每個元素的大小(位元組數)
參數(*compar)(const void *, const void *):此為指向比較函數的函數指針,決定了排序的順序。
函數傳回值:無
注意:如果兩個元素的值是相同的,那麼它們的前後順序是不确定的。也就是說qsort()是一個不穩定的排序算法。
compar參數是qsort函數排序的核心内容,它指向一個比較兩個元素的函數,注意兩個形參必須是const void *型,同時在調用compar 函數(compar實質為函數指針,這裡稱它所指向的函數也為compar)時,傳入的實參也必須轉換成const void *型。在compar函數内部會将const void *型轉換成實際類型,見下文。
如果compar傳回值小于0(< 0),那麼p1所指向元素會被排在p2所指向元素的前面
如果compar傳回值等于0(= 0),那麼p1所指向元素與p2所指向元素的順序不确定
如果compar傳回值大于0(> 0),那麼p1所指向元素會被排在p2所指向元素的後面
是以,如果想讓qsort()進行從小到大(升序)排序,那麼一個通用的compar函數可以寫成這樣:
注意:你要将mytype換成實際數組元素的類型。
或者,如下所示。
版權聲明:本文為部落客原創文章,遵循 cc 4.0 by-sa 版權協定,轉載請附上原文出處連結和本聲明。 本文連結:https://blog.csdn.net/qq_16933601/article/details/107214404
那麼我們向qsort傳入arr之後,qsort将arr了解為指向數組中第一個元素的指針,是以形參表中,arg1和arg2其實是指向“指向常量字元串的指針”的指針,是char**。而我們需要傳給strcmp這個字元串比較函數的,是“指向字元串的指針”,是char*,是以我們将void*轉換為char**,然後解引用,得到char*,賦予a和b。接下來使用strcmp對a和b進行比較。(數組名本身算一層指針,而裡面的内容又是一層指針,數組存放的是指向字元串的位址)
這裡對二維數組進行排序,其實是對二維數組的第二維中存放的字元串進行排序。是以qsort(arr, sizeof(arr)/sizeof(arr[0]), sizeof(arr[0]), compare);對qsort函數的調用中,第二個參數是待排元素的個數(5個),第三個參數是待排元素的大小(16)。
我們将arr傳入qsort函數,qsort函數将arr了解為指向數組第一個元素的指針,arr的第一個元素是arr[0][0],是以參數arg1和arg2指的是指向"a[i][0]"的指針,我們知道,a[i][0]是字元,就是char,是以arg1和arg2指的是char *。我們将void*轉換為char*,賦予a和b,調用strcmp函數對a和b進行比較。
最接近原點的 k 個點
我們有一個由平面上的點組成的清單 points。需要從中找出 k 個距離原點 (0, 0) 最近的點。(這裡,平面上兩點之間的距離是歐幾裡德距離。)你可以按任何順序傳回答案。除了點坐标的順序之外,答案確定是唯一的。
示例 1: 輸入:points = [[1,3],[-2,2]], k = 1 輸出:[[-2,2]] 解釋: (1, 3) 和原點之間的距離為sqrt(10), (-2, 2) 和原點之間的距離為 sqrt(8), 由于 sqrt(8) < sqrt(10),(-2, 2) 離原點更近。 我們隻需要距離原點最近的 k = 1 個點,是以答案就是 [[-2,2]]。 示例 2: 輸入:points = [[3,3],[5,-1],[-2,4]], k = 2 輸出:[[3,3],[-2,4]] (答案 [[-2,4],[3,3]] 也會被接受。) 提示: 1 <= k <= points.length <= 10000 -10000 < points[i][0] < 10000 -10000 < points[i][1] < 10000