按升序排序數值字串向量


在本文中,我們將研究一個 C++ 程式,用於按升序排序數值字串陣列。排序是一個基本操作,它涉及按預定順序組織元素。由於它們是表示數字的基於字元的字串,並且這些數值字串在與排序相關時提供了一組特殊的挑戰。我們將介紹問題陳述、解決問題的方法和演算法、C++ 實現、所提供方法的複雜性推理以及主要要點總結。

問題陳述

考慮一個包含數值字串的向量,目標是根據它們的數值按升序排列它們。具有挑戰性的是,數值字串必須根據其數值而不是其字典序進行排序。

讓我們深入研究一些示例,以便更好地理解問題

假設輸入:["100", "9", "30", "8", "2"]

那麼,輸出:["2", "8", "9", "30", "100"]

說明:輸入向量中的字串分別表示整數 100、9、30、8 和 2。當這些字串按升序排序時,根據其數值,輸出為 ["2", "8", "9", "30", "100"]。

方法

我們使用一個自定義比較器函式來處理字串的長度和數值,以解決按升序方式對這些字串向量進行排序的問題。演算法的工作原理如下

  • 定義一個比較器函式“compareNumericStrings”,它有兩個字串作為輸入。

  • 在比較器函式中,權衡上面作為引數獲取的兩個字串的長度。可能出現 2 種情況

    • 如果長度相等

    • 在這種情況下,我們需要執行字典序比較來確定它們的順序。字典序比較考慮字元的 ASCII 值來確定其順序。

      示例

      字串 1 - "11"

      字串 2 - "16"

      由於兩個字串的長度相同(2 個字元),因此我們繼續進行字典序比較。透過從左到右分析字元,我們可以看出字串 1 的第一個字元是“1”,字串 2 的第一個字元也是“1”。由於它們相等,我們現在繼續進行下一個(第二個)字元比較。字串 1 的第二個字元是“1”,而字串 2 的第二個字元是“6”。字典序比較表明字串 1 小於字串 2,因為在 ASCII 表中,“1”出現在“6”之前。

    • 如果長度不同

    • 在這種情況下,可以透過比較字串的長度來直接確定排列,即長度較短的字串被認為小於長度較長的字串。

      示例

      字串 1 - "50"

      字串 2 - "100"

      這裡,字串 1 的長度為 2,而字串 2 的長度為 3。顯然,2 小於 3,因此,字串 1 被認為小於字串 2。

  • 使用內建的排序演算法,以升序方式組織字串,指定 compareNumericStrings 作為比較字串的函式。

示例

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

// function for sorting numerical strings
bool compare_str(const string& str1, const string& str2) {
   // Lexicographic comparison -> for same-sized strings
   if (str1.size() == str2.size()) {
      return str1 < str2;  
   }
   // Sort by comparing length of strings -> for different-sized strings
   return str1.size() < str2.size();  
}
int main() {
   vector<string> numStrings = { "12", "57", "200", "28", "1" };
   // using the comparison function to sort the vector of numeric strings 
   sort(numStrings.begin(), numStrings.end(), compare_str);
   cout << "Sorted numeric strings in ascending order: ";
   // printing the sorted numeric strings
   for (const auto& s: numStrings) {
      cout << s << " ";
   }
   cout << endl;
   return 0;
}

輸出

Sorted numeric strings in ascending order: 1 12 28 57 200

複雜度分析

時間複雜度 - sort() 使用的排序方法是演算法時間複雜度的主要決定因素。C++ 中的 sort() 函式通常使用 introsort 演算法,該演算法結合了三種不同排序演算法的優點:快速排序、堆排序和插入排序,並且平均時間複雜度為 O(NlogN)。因此,程式的時間複雜度為 O(NlogN),其中 N 是向量中元素的數量。

空間複雜度 - 該演算法只需要常數空間來儲存比較結果,因此其空間複雜度為 O(1)。

使用測試用例進行說明

測試用例 -> {"34", "12", "5", "2"}

  • 程式碼中定義了一個名為“compare_str”的比較函式;它接受兩個字串作為輸入並返回一個布林值。此函式負責根據其長度和字典序比較兩個數值字串。

  • 主函式首先呼叫 sort 函式並將 'compare_str' 比較函式以及 numStrings 向量開始和結束迭代器一起傳遞。這啟動了排序操作。

  • 在 compare_str 函式內部,比較邏輯如下

    • 如果要比較的兩個字串的長度相等,則透過對兩個字串使用 < 運算子(str1 < str2)執行字典序比較。返回此比較的結果。

    • 如果字串的長度不同,則比較基於長度本身。該函式返回使用 < 運算子(str1.size() < str2.size())比較 str1 和 str2 大小的結果。

  • 根據比較函式的邏輯,執行排序操作,並且 numStrings 向量按升序重新組織。在這種情況下,排序後的向量為“2”、“5”、“12”和“34”。

演示測試用例中的程式碼按升序排列數值字串。輸出中顯示了排序後的數值字串“2”、“5”、“12”和“34”。

結論

由於需要同時考慮字串的長度和數值,因此按升序排序包含數值字串的向量提出了一個特殊的問題。我們可以透過建立一個獨特的比較函式並使用 C++ 排序演算法來克服這個困難。提供的實現展示了此問題的簡單解決方案。

在本文中,我們檢查了問題陳述,提出了策略和演算法,提供了 C++ 實現,評估瞭解決方案的複雜性,並強調了關鍵要點。能夠有效地對數值字串進行排序對於開發人員來說是一項至關重要的技能,並且此處描述的方法可以修改以適應各種排序情況。

更新於: 2023-10-06

479 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始
廣告