簡體   English   中英

如何在不使用內置函數的情況下按字母順序對多個字符串進行排序

[英]How to sort multiple strings alphabetically without using built-in functions

我必須按字母順序排序一組沒有任何內置函數的字符串,然后將它們打印在屏幕上。 我曾嘗試將字符串的第一個char轉換為數字值,然后將該值與字符串的其他第一個char進行比較,但我認為這不是一個好選擇。

(像這樣)

for (int i = 0; i < numberOfStrings; i++)
{
  for (int j = i + 1; j < numberOfStrings; j++)
  {
    if ((int)string1[i] > (int)string2[i]         
    {
      biggestFirstChar = (int)string1[i];
    }
  }
}

因此,我想知道在沒有任何功能的情況下按字母順序對多個字符串進行排序的簡便方法是什么。 這是學校的作業。

由於這是一個家庭作業問題,因此我將給出一個有效的答案,而不是實際的代碼版本...

制定算法的方法

  1. 獲取一張紙,將其撕成幾塊,然后在每塊上寫一個字。
  2. 將紙片一個接一個地放(例如,它們代表一個未排序的數組)
  3. 按照清單中的順序整理物品。 嘗試采取程序性方法; 即,因此您每次做出決定時都遵循規則,而不是“神奇地” /智能地跳到下一步。
  4. 嘗試寫下您要遵循的規則。
  5. 再次按照您編寫的規則將列表弄亂,然后重復; 它有效嗎,或者您是否缺少任何規則/是否存在沒有意義的規則。
  6. 至此,您的規則列表實質上是偽代碼。 即,您有一套可以遵循的說明以得到結果; 但它尚未以任何公認的編程語言編寫。
  7. 將那些規則/偽代碼轉換為實際代碼。
  8. 試試看。 如果它不起作用,請嘗試找出問題所在。 如果看不到問題所在,請在此處發布該代碼,並說明您的問題; 然后,我們可以幫助您重新走上正確的道路。

注意:您當然可以查找現有的排序算法並加以實施; 但就我個人而言,我更喜歡上述內容,因為它可以教您自己思考,而不是將現有算法翻譯成您的特定編碼語言。

其他提示

在進行比較時,請考慮您需要做什么。 即,您上面已經問過有關在比較字符串之前將字符串中的字符轉換為數字的問題。 需要該步驟嗎? 您不能簡單地按字母順序比較字符串嗎? https://www.google.co.uk/search?q=c%23+compare+strings+按字母順序

在提供的代碼示例中,您具有值string1string2 ,但從未展示它們的值是如何分配的...是否需要在對變量進行比較之前/在何時何地分配這些變量時是否需要為其分配值發生?

您還會有一個分配了整數j的循環...您將在哪里使用該值/除非要使用它,否則給它分配值的意義是什么?

同樣,您有一個變量biggestFirstChar ,您可以為其分配一個值,但不執行任何操作。 是否需要/您將在哪里使用它?

您得到的結果是一個排序后的值列表,然后您希望將其輸出。 您將結果保存在哪里/按順序輸出結果的代碼在哪里?

您想如何建立結果列表? 也就是說,您是否可以一次填充所有內容,還是必須逐個修改它,直到所有項目都按順序進行?

此外,將問題分解為多個部分並測試每個部分和/或考慮其含義。

  • 您如何產生輸出?
  • 您如何比較2個字符串以確定哪個應該在列表中的第一個?
  • 您如何輸出數組(列表)?
  • 如何將項目添加到結果列表中(或者,如果要處理原始列表,如何在現有列表中交換值)?
  • 給定一個包含2個元素(項目)的數組(列表),編寫代碼以使其順序排列。 確保此方法不管初始順序如何( Aardvark, BalloonBalloon, Aardvark )都可以。
  • 現在將其擴展為3個項目的清單。 但是請確保您的解決方案在列出2個項目的情況下仍然可以使用。
  • 現在嘗試解決原始問題
  • 最后(可選;為了獲得加分),請查看您的代碼,看看是否可以使其變得更好(即重構)。 這意味着查看簡單的演示文稿(您是否縮進了代碼/是否使用了有意義的變量和函數名,是否注釋了所有不自我解釋的內容,等等),還想尋求改進方法(您是否看到效率低下的東西)在哪種方法可能更好的地方/是否重復了可以移出到不同函數中並從所有需要的地方調用的代碼?

您需要兩種方法,冒泡排序(或任何排序算法)和字符串比較算法。

您已經知道冒泡排序,所以我去比較字符串。

int Compare(string x, string y)
{
    if(x == y) return 0;
    if(x == null) return -1;
    if(y == null) return 1;

    int i = 0;
    int length = x.Length <= y.Length ? x.Length : y.Length;

    while(i < length)
    {
        if(x[i] > y[i]) return 1;
        if(x[i] < y[i]) return -1;
        i++;
    }

    if(x.Length == y.Length) return 0;
    if(x.Length > y.Length) return 1;
    else return -1;
}

只需在氣泡排序算法中使用此比較算法即可。

比較兩個字符串

if(Compare(str1, str2) >= 0)
{
    // str1 is bigger or equal
}
else 
{
    // str2 is bigger.
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM