sort方法的比較函式實現原理

2021-09-26 04:57:27 字數 2495 閱讀 4079

在做劍指offer時,有一道題:

題目描述輸入乙個正整數陣列,把陣列裡所有數字拼接起來排成乙個數,列印能拼接出的所有數字中最小的乙個。例如輸入陣列,則列印出這三個數字能排成的最小數字為321323。

思路:自定義比較器,若a+b>b+a則a>b,即」3」+」23」>」23」+」3」則3>23,並且我們希望在排序的時候將23排在3的前面,也就是公升序排列。

class solution 

string printminnumber(vector

numbers)

sort(num2str.begin(), num2str.end(), compare);

for(int i = 0; i < num2str.size(); i++)

return result;}};

這道題的解法中用到了自定義比較器。也就是自定義了campare函式。

但是為什麼當ab

可以看到comp的定義:comp函式返回乙個bool型別的值,這個值表示了在嚴格弱排序中(可以理解為公升序排序)第一引數是否位於第二個引數之前。

也就是說如果comp返回true,則第乙個引數小於第二個引數,sort根據compare的返回值將第乙個引數排在第二個引數之前。

如果comp返回false,則第乙個引數大於第二個引數,sort根據compare的返回值將第乙個引數排在第二個引數之後。

傳入a,b,定義bool myfunction (int i,int j),作為comp函式,

傳入ab,返回false,則排列為ba,

傳入ba,返回true,排列為ba。

是降序排列的。

回到最初的問題中:

static

bool compare(const

string& s1, const

string& s2)

我們可以看出 如果s1=」3」, s2=」23」

ab = 「323」;

ba = 「233」;

事實上ab>ba,所以comp會返回false,sort根據compare返回的false將s2排列在s1之前,也就是排列成」23」,」3」這也就是我們想要的結果。

總結起來就是:

sort函式根據comp函式的返回值,對comp函式的兩個引數排序。

如果comp返回true,排序為「引數1」「引數2」,否則排序為「引數2」「引數1」。

想要公升序排列,則return parameter1parameter2

在做劍指offer時,有一道題:

STL中的sort函式實現原理

stl的sort 演算法,資料量大時採用quick sort,分段遞迴排序。一旦分段後的資料量小於某個閾值,為避免quick sort的遞迴呼叫帶來過大的額外開銷,就改用insertion sort 插入排序 如果遞迴層次過深,還會改用heap sort。stl中的sort並非只是普通的快速排序,除...

sort函式的排序原理

sort函式的排序原理 sort 方法的比較邏輯為 第一輪 1和5比,1和4比,1和2比 第二輪 5和4比,5和2比 第三輪 4和2比 sort函式,對給定區間所有元素進行排序,預設為公升序,也可進行降序排序。sort函式進行排序的時間複雜度為n log2n 注意 不是快排 qsort 是快排 比冒...

理解sort中的比較函式

sort 方法是陣列自帶的一種排序方法,為了實現排序sort方法會預設呼叫每個陣列項的tostring轉型方法 然後比較得到的字串 sort方法接收乙個比較函式,比較函式有兩個引數,如果第乙個引數應該位於第二個引數之前則返回負數,如果相等返回0,如果第乙個引數應該位於第二個引數之後則返回正數 1.當...