字典序與數(shù)字序
?數(shù)字序:按照數(shù)值的大小進(jìn)行排序,比較數(shù)值本身的大小,數(shù)值大的排在后面;
?字典序:按照字符的ASCII碼順序逐字符比較,類似于字典的排序方式,從左到右逐個字符比較,如果當(dāng)前字符相同,比較下一個字符,如果所有字符都相同,較短的字符串排在前面。
穩(wěn)定排序與不穩(wěn)定排序
?排序算法的“穩(wěn)定性”指的是:在排序過程中,值相等的元素,在排序完成后,其原有的相對順序是否保持不變。
??穩(wěn)定排序:在排序完成后,值相等的元素 其原始相對順序保持不變。
??不穩(wěn)定排序:在排序完成后,值相等的元素 其原始相對順序可能被打亂。
?常見的排序算法中,歸并排序是穩(wěn)定排序,快速排序是不穩(wěn)定排序。
先降序后升序示例
?compareTo絕對安全,無溢出風(fēng)險。
?Integer 升序,a.compareTo(b),從小到大:1, 2, 3, 4
?Integer 降序,b.compareTo(a),從大到小:4, 3, 2, 1
?String 升序,s1.compareTo(s2),字典序:apple, banana
?String 降序,s2.compareTo(s1),反字典序:banana, apple
Arrays.sort(people,new Comparator<int[]>(){
public int compare(int[] person1, int[] person2) {
if (person1[0] != person2[0]) {
//優(yōu)先按身高降序
return Integer.compare(person2[0],person1[0]);
} else {
//身高相同則按k值升序
return Integer.compare(person1[1],person2[1]);
}
}
});
Lambda寫法
Arrays.sort(people, (person1, person2) -> {
if (person1[0] != person2[0]) {
return Integer.compare(person2[0], person1[0]); // 身高降序
} else {
return Integer.compare(person1[1], person2[1]); // k值升序
}
});
int[]的降序
int[] nums = {5, 2, 8, 1, 9};
Arrays.sort(nums);
// 然后反轉(zhuǎn)數(shù)組實現(xiàn)降序
for (int i = 0; i < nums.length / 2; i++) {
int temp = nums[i];
nums[i] = nums[nums.length - 1 - i];
nums[nums.length - 1 - i] = temp;
}
List中String類型按字典序排序
List<String> res = personMap.get("C");
res.sort((a,b)->{
return a.compareTo(b);
});
集合按value排序示例
//resMap.keySet()、resMap.values()分別獲取key的集合、value集合構(gòu)建一個List
List<Integer> res = new ArrayList<>(resMap.keySet());
ans.sort((a, b) -> {
int freqCompare = resMap.get(b).compareTo(resMap.get(a));
if (freqCompare == 0) {
return a.compareTo(b);
}
return freqCompare;
});
集合升序簡單排序
Collections.sort(nums);
####集合按某一數(shù)據(jù)出現(xiàn)最高次數(shù)排序(mn構(gòu)造的id為第一個,總分為第二個方便獲取)
Arrays.sort(mn, (a, b) -> {
if (a[1] != b[1]) {
return b[1] - a[1]; // 首先按總分降序
} else {
// 從最高分開始逐級比較
for (int scoreLevel = 10; scoreLevel >= 0; scoreLevel--) {
int countA = 0;
int countB = 0;
// 統(tǒng)計當(dāng)前分?jǐn)?shù)級別出現(xiàn)的次數(shù)
for (int i = 2; i < m + 2; i++) {
if (a[i] == scoreLevel) countA++;
if (b[i] == scoreLevel) countB++;
}
// 如果當(dāng)前級別分?jǐn)?shù)出現(xiàn)次數(shù)不同,按次數(shù)降序
if (countA != countB) {
return countB - countA;
}
}
return a[0] - b[0];
}
});