2010-03-17 35 views
5

Tôi đã mảng sau:Formula cần thiết: Sắp xếp mảng để array- "zig-zag"

a = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] 

tôi sử dụng nó cho một số công cụ trực quan như thế này:

 
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16

Bây giờ tôi muốn sắp xếp mảng như thế này để có "zig-zag" khi hiển thị sau.

// rearrange the array according to this schema 
1 3 6 10 

2 5 9 13 

4 8 12 15 

7 11 14 16 

// the original array should look like this: 

a = [1,5,2,9,6,3,13,10,7,4,14,11,8,15,12,16] 
// the second index to draw should be the first index in the second row, 
// which is represent by 5 in the original 1D Array 

Vâng, bây giờ tôi đang tìm kiếm một công thức thông minh để làm điều đó

ticker = 0; 
rows = 4; // can be n 
cols = 4; // can be n 
originalArray = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]; 
newArray = []; 

while(ticker < originalArray.length) 
{ 
    //do the magic here 
    ticker++; 
} 
+0

Bạn có chắc chắn các ví dụ của mình là chính xác không? Trong trường hợp thứ hai, mảng phẳng không khớp với biểu diễn 2D. –

+0

Gợi ý là trong ví dụ của anh ta. Anh ta muốn sắp xếp các con số thành thứ gì đó giống như một hình thoi đứng với 1 ở trên cùng, sau đó nghiêng 45 ° sang trái. –

+0

Tôi nhận ra zig-zag nhiều hơn sau đó, tôi đã được đưa vào bởi 'sort'-word. Đây thực sự là một hoán vị. – dirkgently

Trả lời

1

Bạn có thể để nó được sắp xếp theo thứ tự ban đầu, bạn chỉ cần bước qua nó một cách khác. EDIT: Hóa ra rằng triển khai ngây thơ của tôi không tính đến kích thước bước khác nhau dựa trên đường chéo. Mã bên dưới và đã được thử nghiệm trong C#.

var diagonals = new [] { 1, 2, 3, 4, 4, 3, 2, 1 }; 
for (int i = 0, m = 0; m < 4; i = i + m, ++m) { 
    for (int j = m, k = 0; k < 4; j = j + diagonals[m+k+1], ++k) { 
      Console.Write(i+j+1 ); 
      Console.Write(" "); 
    } 
    Console.WriteLine(); 
} 

Rõ ràng, bạn có thể sử dụng thuật toán này để điền vào một mảng mới nếu bạn cần giữ thứ tự đó xung quanh. Nó cũng nên mở rộng quy mô - bạn chỉ cần thay đổi điều kiện chấm dứt thành căn bậc hai của kích thước mảng và tự động hóa việc tạo các đường chéo.

+0

Khi tôi chạy vòng lặp này và đẩy các giá trị mảng ban đầu vào một mảng mới, tôi nhận được: newArray = [1,3,6,10,3,5,8,12,7,9,12,16,13 , 15 ,,] –

+0

@aw - Tôi đã cố định điều này để tính toán cho độ dài đường chéo khác nhau và điều chỉnh thứ tự theo đó số gia tăng xảy ra. Điều này đã được thử nghiệm. – tvanfosson

+0

Bây giờ tôi nhận được [1,3,6,10,3,6,10,14,6,10,14,, 10,14 ,,]. Nhưng bạn nói nó đã được kiểm tra, đúng không? –

1

Nhìn vào cấu trúc của ma trận của bạn:

1 3 
|// 
|// 
|//... 
2/5 
//  
// 
4 

Hàng 1 giá khởi điểm 1

Hàng 2nd giá khởi điểm 2 = 1 + 1 (# yếu tố trong zig 1)

Hàng thứ 3 bắt đầu tại 4 = 1 + 1 (# phần tử trong zig thứ nhất) + 2 (# phần tử trong zig thứ 2)

...

Dòng thứ 3 kết thúc vào 6 = bắt đầu thứ 3 liên tiếp + num hàng = 4 + 3 = 7

Bạn có thể lấy được một công thức hình thức đóng cửa cho hàng thứ i và đi trước.

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