2013-03-03 66 views
2

我必須編寫一個程序,它需要輸入多行數據,然後根據給定的幾個命令行參數對它們進行排序。行可以是可變長度的,並且在該行的每個項由逗號分隔,這樣的:多次排序向量

a,b,c,12,3 
d,e,f,4,56 
a,g,h,8,5 

什麼程序所要做的就是在排序基於給定自變量的某些列的輸入端。這很簡單,但最難的部分是我也必須能夠對多個參數進行排序。

例如,命令行參數1,4-(二者升序)將輸出此:

a,g,h,8,5 
a,b,c,12,3 
d,e,f,4,56 

所以排序基於第一列,則第4列。我不知道如何對某些東西進行排序,然後僅使用下一個參數對衝突的元素進行排序,而無需使用整個列。我目前將輸入存儲在矢量矢量中。

作爲一個方面說明,我已經閱讀了一些類似的問題,但他們都只有一定數量的東西進行排序。對於這個程序,每行的項目數可以是從1開始的任意值,並且排序的參數個數也可以變化。

+0

這是可行的,你只需要提供寫比較功能。你能提供一些源代碼嗎? – 2013-03-03 08:45:59

+0

如何按第一列和第四列對「{a,g,h,8,6}」和「{a,g,h,8,5}」進行排序? 「{a,g,h,8,6}」和「{a,g,h}」怎麼樣? – Johnsyweb 2013-03-03 08:46:54

+0

@Johnsyweb你問我還是OP?如果我理解正確,他希望行,使用第一列作爲第一個鍵,然後在第一列中的值相同的情況下,按第四列排序,作爲第二列。如果使用正確的數據結構並編寫'operator <',即使列數是可變的,也不難。 – 2013-03-03 08:51:36

回答

1

首先,使用std :: sort(),它首先處理迭代器,最後一個作爲輸入。 然後,使用遞歸。遞歸是解決方案的關鍵。

對於每個參數,即排序標準C_i,您有一個遞歸級別R_i。在每個遞歸級別R_i內,您有兩個步驟:

  1. 根據標準C_i對給定的數據範圍進行排序。
  2. 遍歷數據範圍。每當值C_I變化,調用下一個遞歸級別R_ {I + 1}與參數:
    • 第一:迭代的最後改變,或者,開始該範圍的
    • 最後:迭代到當前元素(與改變C_I第一元件)
    • 參考/指針標準列表和i + 1

這就是它!

討論的該溶液:

  • 由於迭代器,這種方法是有效的,作爲基礎數據結構不需要被重新初始化,圍繞複製等
  • 您需要編寫一個自定義比較函子,它是用i初始化的,並且總是會根據矢量的元素i進行比較。
  • 什麼是快速的問題值得商榷:做一個大的排序,必須按照我的方法進行每次比較或排序多次,並且每次只檢查一個標準。
  • 在這個解決方案中,很多向量被交換。然而這不是問題,因爲std :: vector swap是便宜的。