اذهب إلى المحتوى

السؤال

نشر

ازاي ال output اترتب لوحده كده؟

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
  vector<int> firstnumbers = { 10, 30, 50, 70 };
  vector<int> secondnumbers = { 20, 40, 60, 80 };
  vector<int> total(firstnumbers.size() + secondnumbers.size());
  merge(firstnumbers.begin(), firstnumbers.end(), secondnumbers.begin(), secondnumbers.end(), total.begin());
  for(int val : total){
    cout << val << endl;
  }
  return 0;
}

Output = 10 \ 20 \30 \40 \50 \60 \70 \80

Recommended Posts

  • 0
نشر (معدل)

هذا بسبب أن الدالة () merge تأخذ عناصر مصفوفتين مرتبتين وتدمجهم وتعطي لنا مصفوفة واحدة مرتبة مكونة من عناصر المصفوفتين.

()firstnumbers.begin: المؤشر الذي يشير إلى العنصر الأول في مصفوفة firstnumbers. سيتم بدء عملية الدمج من هذا الموقع في المصفوفة الأولى.

()firstnumbers.end : المؤشر يشير إلى موقع بعد العنصر الأخير في مصفوفة firstnumbers. يمثل هذا نهاية المدى الذي سيتم دمجه في المصفوفة الأولى.

()secondnumbers.begin : المؤشر يشير إلى العنصر الأول في مصفوفة secondnumbers. سيتم بدء عملية الدمج من هذا الموقع في المصفوفة الثانية.

()secondnumbers.end : المؤشر يشير إلى موقع بعد العنصر الأخير في مصفوفة secondnumbers. يمثل هذا نهاية المدى الذي سيتم دمجه في المصفوفة الثانية.

()total.begin :  المؤشر يشير إلى الموقع الذي سيبدأ فيه تخزين العناصر المدموجة. بمجرد دمج العناصر، سيتم تخزينها في المصفوفة total ابتداءً من هذا الموقع.
 

تم التعديل في بواسطة Mustafa Mahmoud7
  • 0
نشر

لأنه عند استخدامنا لدالة `merge` في C++ وكانت البيانات الداخلة مرتبة بالفعل، فإن الناتج سيكون أيضا مرتبا، وهذا يعني أنه عند دمج `firstnumbers` و `secondnumbers` في `total`، سيتم ترتيب الأرقام بشكل طبيعي.

السبب الرئيسي لذلك هو أن `merge` لا تقوم فقط بدمج العناصر بل تقوم بترتيبها أثناء الدمج. في الحقيقة، الدالة `merge` تتوقع أن يكون كل من `firstnumbers` و `secondnumbers` مرتبا مسبقا، وتقوم بالمزامنة بين القيم في كل فهرس لإنتاج فهرس مرتب.

ففي الكود التي قدمته،  الأرقام في `firstnumbers` و `secondnumbers` مرتبة بالفعل بشكل صاعد، لهذا فإن الدالة `merge` ستقوم بدمجها بشكل مرتب في `total`.وهذا هو السبب في أن الناتج النهائي كان مرتبًا بشكل صاعد.

بمعنى آخر، الترتيب الذي حصلت عليه هو نتيجة مباشرة من طريقة عمل دالة `merge` والتي تتوقع بدورها بأن البيانات المدخلة مرتبة بالفعل.

  • 0
نشر

السبب في طباعة الأرقام بهذا الترتيب هو أن الأرقام في الفيكتور firstnumbers مرتبة بالترتيب التصاعدي (10، 30، 50، 70)، و الأرقام في الفيكتور secondnumbers مرتبة أيضًا بالترتيب التصاعدي (20، 40، 60، 80).

وبعد ذالك يتم دمج هذين الفيكتورين باستخدام الدالة ()merge التي تأخذ مدى العناصر في الفيكتورين المدخلين، وترتبهما معًا في الفيكتور total بترتيب تصاعدي أيضًا.

وبما أن الأرقام في الفيكتور firstnumbers و secondnumbers مرتبة بالترتيب التصاعدي، فإن الأرقام في الفيكتور total (الذي تم دمجهما) ستكون مرتبة بالترتيب التصاعدي أيضًا، مما سيعطيك الناتج الذي حصلت عليه (10، 20، 30، 40، 50، 60، 70، 80).

هذه الكود يستخدم خوارزمية الاندماج هذه الخوارزمية  تحافظ على الترتيب النسبي للعناصر المتساوية.

تعقيد خوارزمية الاندماج O(n log n) ، ده هيجعلها جيده لفرز مجموعات البيانات الكبيرة.

بلاضافه إذا كانت المتجهات المدخلة مرتبة بالفعل، فلن تتطلب عملية الاندماج أي مقارنات أو عمليات تبادل، ده هيؤدي الي تحسن الأداء.

ساعطيك اكثر من مثال سيساعدك في فهمها اكثر 

 

1. دمج متجهين من الأرقام:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
  vector<int> firstnumbers = { 1, 4, 7, 10 };
  vector<int> secondnumbers = { 2, 5, 8, 11 };
  vector<int> total(firstnumbers.size() + secondnumbers.size());

  merge(firstnumbers.begin(), firstnumbers.end(), secondnumbers.begin(), secondnumbers.end(), total.begin());

  for (int val : total) {
    cout << val << " ";
  }

  cout << endl;

  return 0;
}


المخرجات 
 

1 2 4 5 7 8 10 11

2. دمج متجهين من النصوص:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
  vector<string> firstnames = { "Alice", "Bob", "Carol" };
  vector<string> lastnames = { "Smith", "Jones", "Williams" };
  vector<string> fullnames(firstnames.size() + lastnames.size());

  merge(firstnames.begin(), firstnames.end(), lastnames.begin(), lastnames.end(), fullnames.begin(),
        [](string a, string b) { return a + " " + b; });

  for (string name : fullnames) {
    cout << name << endl;
  }

  return 0;
}


المخرجات 
 

Alice Smith
Bob Jones
Carol Williams

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...