الانتقال إلى المحتوى الرئيسي

كيف أقوم بفرز المصفوفة بترتيب تصاعدي في ج? طرق بسيطة وفعالة

يعد فرز المصفوفة بترتيب تصاعدي أحد مهام البرمجة الرئيسية الموجودة في العديد من اللغات ، بما في ذلك ج. في هذه المقالة ، سننظر في عدة طرق بسيطة وفعالة لفرز المصفوفة في ج.

قبل الانتقال إلى خوارزميات الفرز ، ومن الجدير بالذكر أن ج يقدم بعض المدمج في وظائف الفرز ، مثل كسورت. ومع ذلك ، من أجل فهم أفضل لعملية الفرز ، سننظر في تنفيذ الفرز بمفردنا.

الطريقة الأولى التي سننظر فيها هي فرز الفقاعات. هذه الخوارزمية بسيطة للغاية لفهمها وتنفيذها ، ولكنها قد لا تكون الأكثر فعالية للمصفوفات الكبيرة. الفكرة الرئيسية للخوارزمية هي "يطفو على السطح" أكبر عنصر إلى الموضع الأخير من المصفوفة ، ومقارنة أزواج من العناصر المجاورة ومبادلة لهم إذا لزم الأمر.

الطريقة الثانية التي سننظر فيها هي الفرز حسب الإدخالات. في هذه الخوارزمية ، نأخذ عناصر من المصفوفة الأصلية واحدة تلو الأخرى وندخلها في المكان الصحيح في الجزء الذي تم فرزه بالفعل من المصفوفة. هذه الخوارزمية هي أيضا سهلة التنفيذ ويمكن أن تكون فعالة للمصفوفات الصغيرة وفرزها جزئيا.

الطريقة الثالثة التي سننظر فيها هي فرز الاختيار. تتكون هذه الخوارزمية من اختيار أصغر عنصر من الجزء غير المصنف من المصفوفة ووضعه في الموضع الأول. ثم نواصل هذه العملية لبقية المصفوفة ونذهب من خلال جميع عناصرها. يمكن أن تكون هذه الخوارزمية فعالة للمصفوفات الصغيرة ولا تتطلب ذاكرة إضافية للفرز.

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

  1. كيف أقوم بفرز مصفوفة بترتيب تصاعدي في ج?
  2. طريقة "الفقاعة" لفرز مصفوفة في ج
  3. خوارزمية الفرز "الإدراج" لصفيف في ج
  4. كيفية استخدام" دمج " الفرز لمجموعة في ج?
  5. فرز مصفوفة في ج باستخدام خوارزمية " الفرز السريع
  6. كيفية فرز مجموعة من الأعداد الصحيحة في ج باستخدام خوارزمية "فرز الهرم"?
  7. فرز مصفوفة في ج باستخدام خوارزمية " فرز العد
  8. خوارزمية" فرز التحديد " لفرز مصفوفة في ج
  9. طريقة الفرز قذيفة لمجموعة في ج هو وسيلة فعالة
  10. سؤال وجواب
  11. كيف أقوم بفرز المصفوفة بترتيب تصاعدي في ج?
  12. كيف فقاعة الفرز العمل?
  13. كيف يمكنني استخدام كسورت () وظيفة لفرز مجموعة في ج?

كيف أقوم بفرز مصفوفة بترتيب تصاعدي في ج?

فرز المصفوفة هو عملية إعادة ترتيب العناصر في مصفوفة وفقا لمعيار معين. هناك العديد من خوارزميات الفرز في لغة ج ، لكننا سننظر في طريقتين بسيطتين وفعالتين.

مينينديكس = ي;

}

}

// تغيير الحد الأدنى للعنصر مع العنصر الحالي

إنت تيمب = أر [أنا];

أر [أنا] = أر [مينينديكس];

أر [مينينديكس] = درجة الحرارة;

}

}

طريقة "الفقاعة" لفرز مصفوفة في ج

int temp = arr[j];

arr[j] = arr[j+1];

arr[j+1] = temp;

}

}

  1. }
  2. }
  3. int main() {

int arr[] = {64, 34, 25, 12, 22, 11, 90};

int n = sizeof(arr)/sizeof(arr[0]);

bubbleSort(arr, n);

برينتف ("مصفوفة مرتبة:

");

إلى عن على (الباحث الأول = 0; أنا < ن; أنا i)

برينتف ("٪د " ، أر[ط]);

العودة 0;

}

يستخدم هذا الرمز الدالة

بوبليسورت

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

في الوظيفة

الرئيسية

هو مثال على استخدام هذه الوظيفة مع مصفوفة معينة

[]

. بعد استدعاء الوظيفة

بوبليسورت

، سيتم عرض المصفوفة المصنفة باستخدام

وظيفة برينتف

.

طريقة الفرز فقاعة بسيطة جدا وسهلة الفهم ، ولكن لديها تعقيد عالية من التنفيذ — س(ن^2) ، مما يجعلها غير فعالة لمصفوفات كبيرة. بدلا من ذلك ، يوصى باستخدام خوارزميات فرز أكثر كفاءة ، مثل فرز الدمج أو الفرز السريع.

خوارزمية فرز الإدراج لصفيف في ج

تعد خوارزمية فرز الإدراج واحدة من أبسط الطرق وأكثرها فعالية لفرز المصفوفة. تعتمد هذه الخوارزمية على مبدأ إدخال عنصر في جزء تم فرزه بالفعل من المصفوفة.

يمكن تمثيل خوارزمية الفرز "الإدراج" على النحو التالي:

لنفترض أن لدينا جزءا لم يتم فرزه من المصفوفة يبدأ بالعنصر الأول. الجزء المصنف من المصفوفة فارغ حاليا.

نأخذ العنصر الأول من الجزء غير المصنف وندخله في الموضع الصحيح في الجزء المصنف من المصفوفة.

كرر الخطوة 2 لكل عنصر من الجزء غير المصنف من المصفوفة حتى يتم إدراج الجزء غير المصنف بالكامل في الجزء المصنف.

Пример реализации алгоритма сортировки «Вставками» на языке C:

#include

void insertionSort(int arr[], int n) {

int i, key, j;

for (i = 1; i < n; i++) {

  1. key = arr[i];
  2. j = i - 1;
  3. /* Перемещаем элементы arr[0..i-1], которые больше

чем key, на одну позицию вперед */

while (j >= 0 && arr[j] > key) {

arr[j + 1] = arr[j];

j = j - 1;

}

arr[j + 1] = key;

}

}

int main() {

int arr[] = {64, 34, 25, 12, 22, 11, 90};

int n = sizeof(arr) / sizeof(arr[0]);

insertionSort(arr, n);

برينتف ("مصفوفة مرتبة:

");

إلى عن على (الباحث الأول = 0; أنا < ن; أنا i)

برينتف ("٪د " ، أر[ط]);

برينتف("

");

العودة 0;

}

ينفذ هذا الرمز خوارزمية الفرز" الإدراج " على صفيف آر. نتيجة للبرنامج ، سيتم إخراج مصفوفة مرتبة: 11 12 22 25 34 64 90.

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

كيفية استخدام" دمج " الفرز لمجموعة في ج?

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

يمكن تنفيذ عملية الفرز" الدمج " لمصفوفة في ج على النحو التالي:

تقسيم الصفيف الأصلي إلى قسمين متساويين.

الفرز العودي لكل جزء من المصفوفة.

دمج الأجزاء التي تم فرزها مرة أخرى في صفيف واحد.

في ما يلي مثال على رمز ج الذي ينفذ فرز" دمج " لصفيف:

# تشمل

// وظيفة لدمج جزأين تم فرزهما من مصفوفة في جزء واحد

دمج الفراغ (صفيف كثافة العمليات [] ، كثافة العمليات اليسار ، كثافة العمليات الأوسط ، كثافة العمليات اليمين) {

الباحث الأول ، ي ، ك;

إنت ن1 = وسط اليسار + 1;

كثافة العمليات ن2 = يمين-وسط;

// Создание временных массивов

int LeftArray[n1], RightArray[n2];

// Копирование данных во временные массивы

for (i = 0; i < n1; i++)

LeftArray[i] = array[left + i];

for (j = 0; j < n2; j++)

RightArray[j] = array[middle + 1 + j];

// Слияние временных массивов обратно в основной массив

i = 0;

j = 0;

k = left;

while (i < n1 && j < n2) {

if (LeftArray[i] <= RightArray[j]) {

array[k] = LeftArray[i];

i++;

}

else {

array[k] = RightArray[j];

j++;

}

k++;

}

// نسخ العناصر المتبقية من اليسار [] إلى مجموعة [] ، إذا كان هناك

أي حين (أنا < ن1) {

صفيف [ك] = اليسار [أنا];

أنا++;

k++;

}

// نسخ العناصر المتبقية من ريتاراي [] إلى مجموعة [] ، إذا كان هناك

أي حين (ي < ن2) {

صفيف [ك] = ريتاراي [ي];

j++;

k++;

}

}

// وظيفة لفرز المصفوفة العودية

فواد ميرجيسورت (إنت صفيف [] ، إنت اليسار ، إنت الحق) {

إذا (يسار < يمين) {

// ابحث عن الوسط لتقسيم المصفوفة إلى قسمين

كثافة العمليات الأوسط = يسار + (يمين-يسار) / 2;

// الفرز العودي للنصفين الأول والثاني من المصفوفة

ميرجيسورت (صفيف ، يسار ، وسط);

ميرجيسورت (صفيف ، وسط + 1 ، يمين);

// دمج الأجزاء المصنفة

دمج (صفيف ، يسار ، وسط ، يمين);

}

}

// وظيفة لعرض صفيف

فواد برينتراي (إنت صفيف [] ، إنت حجم) {

الباحث الأول;

ل (أنا = 0 ؛ أنا < الحجم ؛ أنا i)

برينتف ("٪د " ، صفيف [أنا]);

برينتف("

");

}

// مثال على استخدام دمج الفرز لمصفوفة في ج

كثافة العمليات الرئيسية () {

صفيف كثافة العمليات[] = {12, 11, 13, 5, 6, 7};

حجم كثافة العمليات = حجم (صفيف) / حجم (صفيف [0]);

برينتف ("صفيف المصدر:

");

برينتراي (صفيف ، حجم);

ميرجيسورت (صفيف ، 0 ، حجم-1);

برينتف ("مصفوفة مرتبة:

");

برينتراي (صفيف ، حجم);

العودة 0;

}

بعد تنفيذ هذا الرمز ، سترى مصفوفة مرتبة على الإخراج القياسي.

دمج الفرز لديه تعقيد الوقت من س (نلوغن) والتعقيد المكاني من س(ن) ، مما يجعله حلا فعالا لفرز المصفوفات من مختلف الأحجام.

فرز مصفوفة في ج باستخدام خوارزمية " الفرز السريع

فرز سريع (إنجليزي فرز سريع هي واحدة من خوارزميات الفرز الأكثر كفاءة للمصفوفات. إنه ينتمي إلى فئة الفرز حسب طريقة التبادل. تعتمد الخوارزمية على مبدأ فرق تسد: يتم تحديد عنصر مرجعي ، حيث يتم تقسيم المصفوفة إلى مجموعتين — عناصر أصغر من المرجع وعناصر أكبر من المرجع. ثم تتكرر هذه العملية لكل مجموعة من المجموعات الناتجة حتى يتم تحقيق فرز كامل للمصفوفة.

في ما يلي مثال على رمز ج لفرز مصفوفة باستخدام خوارزمية " الفرز السريع:

# تشمل

فواد كويكسورت (إنت *أر ، إنت منخفضة ، إنت عالية) {

إنت أنا ، ي ، بيفوت، تمب;

إذا (منخفض < مرتفع) {

المحور = آر [منخفض];

أنا = منخفض;

ي = عالية;

بينما (أنا < ي) {

في حين (أر [أنا] < = محور & & أنا < = عالية) {

أنا++;

}

while (arr[j] > pivot && j >= low) {

j--;

}

if (i < j) {

tmp = arr[i];

  1. arr[i] = arr[j];
  2. arr[j] = tmp;
  3. }
  4. }

tmp = arr[j];

arr[j] = arr[low];

arr[low] = tmp;

quickSort(arr, low, j - 1);

quickSort(arr, j + 1, high);

}

}

int main() {

int arr[] = {7, 2, 1, 6, 8, 5, 3, 4};

int n = sizeof(arr) / sizeof(arr[0]);

quickSort(arr, 0, n - 1);

printf("Отсортированный массив: ");

for (int i = 0; i < n; i++) {

printf("%d ", arr[i]);

}

return 0;

}

في هذا المثال ، تقوم وظيفة الفرز السريع بشكل متكرر بفرز المصفوفات الفرعية باستخدام العنصر المرجعي[منخفض] وأداء تباديل العناصر في المصفوفة. هذا يسمح لك بترتيب المصفوفة بسرعة في ا (ن سجل ن) زمن ، أين ن هو عدد العناصر في المصفوفة.

ستكون نتيجة تنفيذ البرنامج كما يلي:

مجموعة مرتبة: 1 2 3 4 5 6 7 8

وبالتالي ، فإن خوارزمية "الفرز السريع" هي طريقة فعالة لفرز مصفوفة في لغة ج. يسمح لك بترتيب عناصر المصفوفة بسرعة وموثوقية بترتيب تصاعدي.

كيفية فرز مجموعة من الأعداد الصحيحة في ج باستخدام خوارزمية "فرز الهرم"?

الفرز الهرمي (أو الفرز الهرمي) هو أحد طرق الفرز التي تعتمد على استخدام كومة ثنائية. إنها عالية الكفاءة وهي خوارزمية فرز مستقرة ، أي أنها تحافظ على الترتيب النسبي للعناصر المتساوية.

لفرز مجموعة من الأعداد الصحيحة باستخدام الفرز الهرمي ، اتبع الخطوات التالية:

قم بإنشاء هرم (كومة ثنائية) من مصفوفة معينة. الهرم هو بنية بيانات تكون فيها كل عقدة عنصرا في صفيف ، ويكون لأحفاد كل عقدة قيم أصغر من العقدة.

بعد إنشاء الهرم ، سيكون أكبر عنصر في المصفوفة موجودا في جذر الهرم.

استبدل جذر الهرم بالعنصر الأخير من المصفوفة ، وبالتالي "استخراج" أكبر عنصر من الهرم وإضافته إلى نهاية الجزء المصنف من المصفوفة.

Перестроить пирамиду и продолжать процесс до тех пор, пока пирамида не останется пустой.

Вот пример кода на языке С, реализующий алгоритм пирамидальной сортировки:

#include

void heapify(int arr[], int n, int i) {

int largest = i;

int l = 2 * i + 1;

int r = 2 * i + 2;

if (l arr[largest])

largest = l;

if (r arr[largest])

largest = r;

if (largest != i) {

int temp = arr[i];

arr[i] = arr[largest];

arr[largest] = temp;

  1. heapify(arr, n, largest);
  2. }
  3. }
  4. void heapSort(int arr[], int n) {
  5. for (int i = n / 2 - 1; i >= 0; i--)

heapify(arr, n, i);

for (int i = n - 1; i >= 0; i--) {

int temp = arr[0];

arr[0] = arr[i];

arr[i] = temp;

heapify(arr, i, 0);

}

}

int main() {

int arr[] = {64, 34, 25, 12, 22, 11, 90};

int n = sizeof(arr) / sizeof(arr[0]);

heapSort(arr, n);

printf("Отсортированный массив:

");

for (int i = 0; i < n; i++)

printf("%d ", arr[i]);

return 0;

}

في هذا المثال ، نقوم بإنشاء هرم من مصفوفة معينة ، وفرزها ، وعرض المصفوفة المصنفة على الشاشة.

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

فرز صفيف في ج باستخدام

خوارزمية "فرز العد" ، فرز العد هي خوارزمية فرز تعتمد على حساب عدد العناصر بقيمة معينة. وهو فعال عند فرز المصفوفات مع مجموعة محدودة من القيم.

لفرز مصفوفة باستخدام خوارزمية "فرز العد" ، اتبع الخطوات التالية:

حدد القيم الدنيا والقصوى في المصفوفة.

قم بإنشاء مصفوفة جديدة (عداد) بطول يساوي الفرق بين القيم القصوى والدنيا ، بالإضافة إلى واحد (لحساب مؤشر الصفر).

انتقل إلى المصفوفة الأصلية وقم بزيادة قيمة العداد لكل عنصر في الفهرس المقابل.

قم بتجميع مجموع قيم العداد لتحديد موضع كل عنصر في المصفوفة المصنفة.

قم بإنشاء مصفوفة جديدة (مصفوفة مرتبة) واملأها بقيم من المصفوفة الأصلية وفقا للمواضع المحددة بواسطة العداد.

خوارزمية "فرز العد" لها تعقيد خطي لـ ا(ن+ك) ، أين ن هو عدد العناصر في المصفوفة ، ك هو الفرق بين القيم القصوى والدنيا.

مثال على رمز ج لفرز مصفوفة باستخدام خوارزمية " فرز العد:

# تشمل

عد باطل (الباحث آر [] ، الباحث ن) {

// ابحث عن القيم الدنيا والقصوى في المصفوفة

كثافة العمليات دقيقة = آر [0] ، ماكس = آر [0];

ل (إنت أنا = 1 ؛ أنا < ن ؛ أنا {) {

إذا (آر [أنا] < دقيقة) {

دقيقة = آر [أنا];

}

إذا (آر [أنا] > ماكس) {

ماكس = آر [أنا];

}

}

// إنشاء وتهيئة

عداد النطاق الدولي = الحد الأقصى + 1;

عدد الباحث [نطاق];

ل (إنت أنا = 0 ؛ أنا < المدى ؛ أنا i) {

العد [أنا] = 0;

}

// زيادة قيمة العداد لكل عنصر في المصفوفة الأصلية

إلى عن على (كثافة العمليات أنا = 0 ؛ أنا < ن ؛ أنا i) {

العد [آر [أنا] - دقيقة]++;

}

  1. // تجميع مجموع قيم العداد
  2. ل (إنت أنا = 1 ؛ أنا < المدى ؛ أنا i) {
  3. العد [أنا] + = العد [أنا-1];

}

// إنشاء وملء المصفوفة المصنفة

الباحث فرز [ن];

إلى عن على (كثافة العمليات أنا = 0 ؛ أنا < ن ؛ أنا i) {

فرز [العد [أر [أنا] - دقيقة] - 1] = أر [أنا];

العد [آر [أنا] - دقيقة]--;

}

// انسخ المصفوفة المصنفة إلى المصفوفة الأصلية

إلى عن على (كثافة العمليات أنا = 0 ؛ أنا < ن ؛ أنا i) {

أر [أنا] = مرتبة [أنا];

}

}

كثافة العمليات الرئيسية () {

إنت آر[] = {9, 4, 7, 2, 1, 6, 3, 8, 5};

إنت ن = سيزوف ( أر) / سيزوف (أر[0]);

الفرز (آر، ن);

برينتف ("مصفوفة مرتبة:");

إلى عن على (كثافة العمليات أنا = 0 ؛ أنا < ن ؛ أنا i) {

برينتف ("٪د " ، أر[ط]);

ابحث عن أصغر عنصر في المصفوفة.

مبادلة مع العنصر الأول.

كرر العملية للجزء المتبقي من المصفوفة ، باستثناء العناصر التي تم فرزها بالفعل.

مثال على تنفيذ خوارزمية "فرز الاختيار" في ج:

باطل سيليكتيونسورت (إنت مجموعة [] ، إنت حجم) {

int i, j, minIndex, minValue;

for (i = 0; i < size - 1; i++) {

  1. minIndex = i;
  2. minValue = array[i];
  3. for (j = i + 1; j < size; j++) {
  4. if (array[j] < minValue) {

minIndex = j;

minValue = array[j];

}

}

if (minIndex != i) {

int temp = array[i];

array[i] = array[minIndex];

array[minIndex] = temp;

}

}