2012-02-17 8 views
8

Tôi đang triển khai phiên bản sắp xếp hợp nhất trong c. Đối với bước đầu tiên, tôi phải chia mảng thành mảng phụ.Thực hành không tốt để tách một mảng C bằng cách sử dụng một con trỏ ở giữa nó?

Thực hành không tốt chỉ đơn giản là làm điều này bằng cách có hai con trỏ, một trỏ đến bắt đầu của mảng ban đầu và thứ hai trỏ đến giữa?

Hoặc tôi nên malloc 2 khe cắm bộ nhớ mới, sao chép các giá trị thích hợp ở đây và sau đó giữ một con trỏ đến không gian này?

Trả lời

12

Tôi không nghĩ rằng đó là thực tế xấu nếu bạn biết những gì bạn đang làm. Trong một số trường hợp, bạn hy sinh khả năng đọc cho hiệu quả. Nó có thể rõ ràng hơn nếu bạn chỉ cần tạo thêm hai mảng, nhưng nếu bạn có một nắm vững về mảng và con trỏ, tại sao phân bổ bộ nhớ thêm?

+6

Mặt khác, làm bất cứ điều gì trong C nếu bạn không biết những gì bạn đang làm là thực hành xấu. –

+0

@WilliamPursell :) trừ khi bạn sử dụng 'printf' không có tham số variadic. Điều đó khá dễ dàng. –

+2

@LuchianGrigore, bạn có nghĩa là 'printf ("% s \ n ");'? – ugoren

2

Chỉ sử dụng một mảng trong trường hợp này (như sắp xếp hợp nhất). Gọi malloc là không cần thiết, trừ khi kích thước của mảng quá lớn cho ngăn xếp.

11

Tuyệt đối không! Toàn bộ điểm lập trình trong C là có thể thực hiện các thủ thuật con trỏ gọn gàng này!

Tuy nhiên, lưu ý rằng việc hợp nhất không phải là tại chỗ, do đó bạn vẫn sẽ cần phải malloc một mảng phụ trợ. Nếu bạn làm các thủ thuật con trỏ chính xác, bạn có thể chỉ malloc một lần và tái sử dụng nó mặc dù.

2

Nói chung với sắp xếp hợp nhất bạn muốn đặt kết quả hợp nhất vào bộ nhớ bị chiếm bởi đầu vào gốc. Nếu vậy, thì bạn nên:

  • loại cả hai nửa
  • sao chép "thấp hơn" một nửa số mảng của bạn vào một bộ đệm mới được phân bổ, rời khỏi "trên" nửa nó ở đâu
  • merge từ "trên" một nửa và bộ đệm bổ sung, vào "đáy" của mảng lớn.

Bằng cách đó, bạn chỉ cần cấp thêm bộ nhớ bổ sung là một nửa số kích thước của đầu vào. Bạn thậm chí có thể làm điều đó một lần ngay từ đầu, và tái sử dụng bộ đệm giống như không gian làm việc cho tất cả các hợp nhất mà bạn sẽ làm.

1

Không, không tệ, và trên thực tế, tôi cho rằng đây là một trong những lý do duy nhất để sử dụng C ngay từ đầu. Nếu bạn định tạo các bản sao lãng phí dữ liệu mỗi khi bạn cần xử lý cùng một dữ liệu hơi khác, bạn đã viện dẫn một trong những chi phí lớn nhất của các ngôn ngữ kịch bản cấp cao. Bạn cũng đã tăng đáng kể số lượng lỗi xử lý mã của bạn phải làm (vì việc phân bổ có thể thất bại), và do việc xử lý lỗi trong C có xu hướng hơi "tiết lộ" (đặt nó vui), chi phí phức tạp ròng tệ hơn nhiều so với chi phí phức tạp nhỏ của việc truy cập một subarray tại chỗ.