2016-04-05 66 views
1

我有這種排序「arr1」的氣泡排序算法。C#用Bubble排序3個數組排序

static int yearAscDes(int value)` 
    { 
if (value == 0) 
{ 
      int[] arr1 = { 1930, 1931, 2016, 2014, 2012 }; 
      int temp1 = 0; 

      for (int i1 = 0; i1 < arr1.Length; i1++) 
      { 
       for (int j1 = 0; j1 < arr1.Length - 1; j1++) 
       { 
        if (arr1[j1] < arr1[j1 + 1]) 
        { 
         temp1 = arr1[j1 + 1]; 
         arr1[j1 + 1] = arr1[j1]; 
         arr1[j1] = temp1; 
        } 
       } 
      } 

      for (int i1 = 0; i1 < arr1.Length; i1++) 
      { 

       Console.Write(arr1[i1] + " \n"); 
      } 
      return 0; 
} 

我想排序3個不同的陣列使用這種算法,他們相互比較。

例如,

int[] arr1 = {1930, 1931, 2016, 2014, 2012}; 
string[] Months = {"Jan", "March", "Dec", "May", "Sept"}; 
int[] Num = {10, 5, 1, 3, 12}; 

如果我有這些陣列我按升序排序ARR1,我想要的結果看起來像這樣:

結果:

ARR1月民

2016 12月1日

2014年5月3日

2012年9月12日

1931年3月5日

1930年01月10

+4

爲什麼不直接使用1個陣列'DateTime'的? –

+2

儘管@SamIam在說,如果你必須堅持這個數據結構,當你說'arr1 [j1 + 1] = arr1 [j1];'你能不能也只是在那裏添加'月[j1 + 1] = Months [j1];''和'Num [j1 + 1] = Num [j1];'以及另存兩個臨時值'temp2 = Months [j1 + 1]'和'temp3 = Num [j1 + 1]' –

+0

把日期分成3個數組看起來對我來說真的很不直觀。你可以爲自己節省那個巨大的排序功能,並與@SamIam所說的一樣。 – rinukkusu

回答

0

如果您有興趣使其對您的工作或副項目有用,我建議使用DateTime。它會保存你關心的所有事情,還有更多。您還可以在陣列中使用Sort().orderBy(..)


如果你有興趣在實際執行你的事情,對於運動的緣故,我們必須有幾個假設。

  • 所有3個數組的大小相同
  • 你真的只關心那些陣列的初步指標,並沒有真正排序每個陣列的。這是從您的示例派生的

因此,您應該使用2d數組或KeyValue對的數組。一個是你的年份,另一個是初始索引。
然後,一旦完成了對年份的排序,您可以查看年份值的初始索引,並獲取該索引形式的Months和Days數組的元素。

另一個想法: 您可以保持3個數組原樣,但是當您執行Years數組索引的swap時,請對其他兩個數組進行交換。只要確保你只使用Years數組中的游泳檢查條件。這樣,當「年」數組進行排序時,您還將根據「年數組」索引對其他兩個數組進行排序。 您的代碼:

if (arr1[j1] < arr1[j1 + 1]) 
{ 
    temp1 = arr1[j1 + 1]; 
    arr1[j1 + 1] = arr1[j1]; 
    arr1[j1] = temp1; 
} 

應該是這樣成才

if (arr1[j1] < arr1[j1 + 1]) 
{ 
    temp1 = arr1[j1 + 1]; 
    arr1[j1 + 1] = arr1[j1]; 
    arr1[j1] = temp1; 

    tempMonths = months[j1 + 1]; 
    months[j1 + 1] = months[j1]; 
    months[j1] = tempMonths; 

    tempDays = days[j1 + 1]; 
    days[j1 + 1] = days[j1]; 
    days[j1] = tempDays; 
} 
4

如果你能擺脫它,你應該只使用1個陣列的DateTime

DateTime[] dt = {new DateTime(1930, 1, 10), new DateTime(1931, 3, 5) /*...*/}; 

如果你因爲某些原因不能這樣做是因爲這是作業,那麼下一個最好的做法是讓你自己的班級有一年,一個月,一天,並且包括一個可以爲你做比較的方法。