2010-12-29 24 views
13

Chúng tôi có một loạt các kích thước m + n trong đó m yếu tố này là hiện tại, theo thứ tự sắp xếp, và một mảng thứ hai của kích thước n, một lần nữa theo thứ tự sắp xếp. Chúng tôi muốn cả hai được sắp xếp và hiển thị trong mảng đầu tiên. Không có mảng thứ ba là .merge Trong chỗ của hai mảng

Ví dụ:

1, 3, 55, 66, 77, _, _, _ 
    5, 9, 20 

Câu trả lời sẽ là:

1, 3, 5, 9, 20, 55, 66, 77 
+1

Vì vậy, hãy sử dụng loại hợp nhất. Và câu hỏi là? –

+0

@Mark Byers no, nó không phải là một sự lừa dối vì điều này có n lưu trữ thêm chứ không phải là thực sự tại chỗ –

+0

@Pete Kirkham: Tôi thấy, xin lỗi! –

Trả lời

25

Thực hiện sắp xếp hợp nhất thông thường nhưng ngược lại so sánh các số lớn nhất trước tiên, lưu trữ (đảo ngược) vào cuối mảng đầu tiên quay ngược lại. Bằng cách này, các yếu tố bạn đang hợp nhất không bao giờ bị ghi đè (điều này hoạt động rất dễ dàng để xem nếu bạn nghĩ về nó một lúc).

+0

Giải pháp gọn gàng! +1 – kyun

+2

Câu trả lời hay. "Thực hiện sắp xếp hợp nhất thông thường" loại bỏ "sắp xếp" khỏi câu trả lời của bạn. Những người khó hiểu của nó. – Mangoose

1

Di chuyển các nội dung của mảng đầu đến cuối của mảng đầu tiên, chẳng hạn rằng các yếu tố có sản phẩm nào hiện nay có ngay từ đầu . Sau đó hợp nhất hai chuỗi như bình thường vào mảng đầu tiên.

+0

sự cần thiết phải thay đổi các phần tử đến cuối mảng đầu tiên là gì. Chúng ta có thể bắt đầu so sánh các phần tử từ cuối của hai mảng và sẽ đặt các phần tử vào cuối mảng đầu tiên. –

+0

@prp đề xuất của bạn cũng nên hoạt động và dễ dàng hơn. tôi đã được sử dụng để sáp nhập bằng cách chọn nhỏ hơn. –

1

Tại chỗ về cơ bản yêu cầu chúng tôi chỉ sử dụng bộ nhớ "liên tục", không thay đổi với các kích thước mảng đầu vào khác nhau. Tuy nhiên, câu hỏi tự phân bổ số lượng bộ nhớ bổ sung bằng với kích thước của một trong hai mảng đầu vào, đó là bộ nhớ O (n) trong trường hợp xấu nhất. Này về cơ bản làm cho ý tưởng "tại chỗ" vô nghĩa ...

Câu hỏi đặt ra có thể được phrased tốt hơn là "hợp nhất mà không cần thêm bộ nhớ", mà là một mô tả chính xác hơn về ý định thực sự của nó ...

1
// merge the elements in B[] to A[], starting from the last one 
    void merge(int A[], int m, int B[], int n) { 
     // m-1 and n-1 represent the current element index in A[] and B[] respectively 
     while (n > 0) { // there are still elements in B[] not merged 
      if (m > 0 && A[m-1] > B[n-1]) { // current element in A[] > current element in B[] 
      A[m+n-1] = A[m-1]; // move current element of A[] to its right position 
      --m; // decrease current element index of A[] 
      } 
     else { // current element in A[] <= current element in B[] 
      A[m+n-1] = B[n-1]; // move current element in B[] to its right position 
      --n; // decrease current element index of B[] 
     } 
     } 
    } 
+0

Bạn có thể cung cấp một số lời giải thích? – Undo

+0

xem các nhận xét trong mã – Yanling

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