2017-04-12 25 views
5

Tôi đang cố gắng tạo ra giải pháp ban đầu cho vấn đề cân bằng nhóm nhưng dường như tôi bị kẹt vào thứ gì đó nghe có vẻ khá đơn giản.Chỉ số của các phần tử theo thứ tự từ nhỏ nhất đến lớn nhất

Về cơ bản tôi có một mảng trọng số (số nguyên ngẫu nhiên), ví dụ:

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

Và tôi muốn tạo một mảng khác có cùng độ dài với số 1 đến kích thước của mảng thay cho số nhỏ nhất đến lớn nhất tương ứng, ví dụ:

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

Đối với các bản sao, lần xuất hiện đầu tiên được xem là nhỏ hơn của chỉ mục.

Ban đầu tôi đã sử dụng thuật toán BubbleSort, nhưng rất tiếc điều này không cho phép tôi cung cấp kết quả theo định dạng bắt buộc.

Tôi hiểu rằng đây là một vấn đề khá cụ thể, nhưng mọi trợ giúp sẽ được đánh giá cao.

+1

Liệu điều này cần phải được thực hiện trong bộ nhớ? Nếu bạn không gần như chắc chắn sẽ tốt hơn để thả các giá trị vào một bảng tính và sử dụng các hàm dựng sẵn để làm điều này – User632716

Trả lời

0

Cảm ơn bạn rất nhiều vì đã giúp đỡ!

Tôi lấy đề xuất của bạn và bằng cách nào đó đã cố gắng giả mạo giải pháp của riêng tôi, mặc dù đã dành cả ngày làm việc về một thứ gì đó rất ít liên quan đến dự án tổng thể của tôi.

Dưới đây là đoạn mã sau tôi đã sử dụng:

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

Bạn phải tìm cách kết hợp các giá trị (nội dung) và các chỉ mục. Vì bạn đã gắn cờ với excel-vba, tôi khuyên bạn nên ghi dữ liệu vào trang tính, cột đầu tiên là các giá trị và cột thứ hai là các chỉ mục và sắp xếp chúng bằng cách sử dụng range.sort. Sau đó, cột thứ 2 giữ đơn đặt hàng của bạn

Nếu sử dụng Excel không phải là tùy chọn, đặt cược tốt nhất tôi có thể nghĩ là tạo Scripting.Dictionary (với chỉ mục làm khóa) và sắp xếp (không có chức năng xây dựng để sắp xếp) bạn có thể tìm thấy một số ví dụ:

Hoặc bạn có thể làm điều gì đó xấu xí như tạo một mảng tăng gấp đôi từ dữ liệu của bạn với phần thập phân giữ bạn chỉ mục [1.001, 4.002, 3.003, 2.004, 5.005, 3.006, 2.007, 1.008], sắp xếp số thập phân và nhân chúng trở lại số nguyên

2

Hãy thử cách này và cho tôi biết cách thức hoạt động của bạn:

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

Câu trả lời hay nhất @Ralph –

Các vấn đề liên quan