2017-04-12 13 views
5

के लिए तत्वों के सूचकांक समूह समूह संतुलन की समस्या के लिए प्रारंभिक समाधान तैयार करने की कोशिश कर रहा हूं, लेकिन मुझे ऐसा लगता है कि यह कुछ सरल होना चाहिए।सबसे छोटे से सबसे बड़े

असल में मेरे पास वजन (यादृच्छिक पूर्णांक) की एक सरणी है, उदा।

W() = [1, 4, 3, 2, 5, 3, 2, 1] 

और मैं क्रमशः जैसे सबसे बड़ी संख्या के लिए छोटी से छोटी के स्थान पर सरणी के आकार के नंबर 1 के साथ एक ही लंबाई का एक और सरणी बनाने के लिए, चाहते हैं

S() = [1, 7, 5, 3, 8, 6, 4, 2] 

डुप्लिकेट के लिए, पहली घटना सूचकांक के छोटे के रूप में ली जाती है।

मैंने मूल रूप से एक बबलस्पोर्ट एल्गोरिदम का उपयोग किया, लेकिन दुर्भाग्य से यह मुझे आवश्यक प्रारूप में आउटपुट देने की अनुमति नहीं देता है।

मैं समझता हूं कि यह एक विशिष्ट समस्या है, लेकिन किसी भी मदद की सराहना की जाएगी।

+1

स्मृति में किया जाना इस जरूरत है:

यहाँ निम्नलिखित कोड मैं का इस्तेमाल किया है? यदि नहीं, तो आप मूल्यों को स्प्रेडशीट में छोड़ने के लिए निश्चित रूप से बेहतर होंगे और – User632716

उत्तर

0

आपकी मदद करने वाले हर किसी के लिए बहुत बहुत धन्यवाद!

मैंने आपके सुझावों को लिया और किसी भी तरह से अपने पूरे प्रोजेक्ट के साथ बहुत कम करने के लिए पूरे दिन काम करने के बावजूद अपना खुद का समाधान तैयार करने में कामयाब रहा।

Sub InitialSol(S() As Integer, n As Integer, k As Integer, W() As Long) 
Dim i As Integer, c As Integer 
Dim min As Long, max As Long, temp As Long 

min = W(1) 
max = W(1) 
For i = 2 To n 
    If W(i) <= min Then 
     min = W(i) 
    End If 
    If W(i) >= max Then 
     max = W(i) 
    End If 
Next i 

c = 1 
Do While c <= n 
    temp = max 
    For i = 1 To n 
     If W(i) = min Then 
      S(i) = c 
      c = c + 1 
     End If 
    Next i 
    For i = 1 To n 
     If W(i) > min And W(i) <= temp Then 
      temp = W(i) 
     End If 
    Next i 
    min = temp 
Loop 

End Sub 
1

आपको मूल्यों (सामग्री) और अनुक्रमणिका को एक साथ चिपकाने का एक तरीका खोजना होगा। जैसा कि आपने excel-vba के साथ फ़्लैग किया है, मैं सुझाव दूंगा कि आप डेटा को शीट में लिखते हैं, पहले मानों को कॉलम करते हैं और इंडेक्स को दूसरे कॉलम करते हैं और उन्हें range.sort का उपयोग करके सॉर्ट करते हैं। उसके बाद, 2 स्तंभ अपने आदेश

रखता है एक्सेल का उपयोग कर एक विकल्प, सबसे अच्छा शर्त के बारे में मैं बनाने के बारे में सोच सकते है नहीं है एक Scripting.Dictionary (कुंजी के रूप में सूचकांक के साथ) और इस सॉर्ट (वहाँ समारोह में कोई निर्माण सॉर्ट करने के लिए है यह लेकिन यह googling आप कुछ उदाहरण मिल सकते हैं।

या आप आप सूचकांक [1.001, 4.002, 3.003, 2.004, 5.005, 3.006, 2.007, 1.008], तरह इस, दशमलव मिलता है और के लिए उन्हें वापस गुणा पकड़े कुछ बदसूरत है जैसे आप दशमलव भाग के साथ डेटा से युगल की एक सरणी बनाने के कर सकता है पूर्णांक

2

इसे आज़माएं और मुझे बताएं कि यह आपके लिए कैसे काम करता है:

Option Base 0 
Option Explicit 
Option Compare Text 

Sub tmpSO() 

Dim tmp As Double 
Dim strJoin As String 
Dim i As Long, j As Long 
Dim W As Variant, S() As Double, X() As Long 

'Load W 
W = Array(1, 4, 3, 2, 5, 3, 2, 1) 

'Set the dimensions for the other arrays 
ReDim S(LBound(W) To UBound(W)) 
ReDim X(LBound(W) To UBound(W)) 

'Copy W into S 
For i = LBound(W) To UBound(W) 
    S(i) = W(i) 
Next i 

'Sort S 
For i = LBound(S) To UBound(S) - 1 
    For j = i + 1 To UBound(S) 
     If S(i) > S(j) Then 
      tmp = S(j) 
      S(j) = S(i) 
      S(i) = tmp 
     End If 
    Next j 
Next i 

'Get the results into X 
For i = LBound(S) To UBound(S) 
    X(i) = WorksheetFunction.Match(W(i), S, 0) 
    S(WorksheetFunction.Match(W(i), S, 0) - 1) = vbEmpty 
Next i 

'Print out W (original array) 
Debug.Print Join(W, ",") 

'Print out x (result array) 
For i = LBound(X) To UBound(X) 
    strJoin = strJoin & "," & X(i) 
Next i 
Debug.Print mid(strJoin, 2) 

End Sub 
+0

अच्छा जवाब @Ralph करने के लिए अंतर्निहित कार्यों का उपयोग करें –

संबंधित मुद्दे