الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

حل سؤال ل array of pointer

بدأه norhan ahmad في 3 يوليو 2011 · 2 رد · 437 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم و رحمته الله وبركاته :

أنا حليت هذا السؤال ع Quick Sort وحاولت احله ع array of pointer ما اعرفت غير Quick Sort

ارجو منكم المساعدة ضروري وشكرا لكم :

 #include<iostream.h>
 void quickSort(int arr[], int left, int right) {
 int i = left, j = right;
 int tmp;
 int pivot = arr[(left + right) / 2];

 /* partition */
 while (i <= j) {
 while (arr < pivot)
 i++;
 while (arr[j] > pivot)
 j--;
if (i <= j) {
 tmp = arr;
 arr = arr[j];
 arr[j] = tmp;
 i++;
 j--;
 }
 };

 /* recursion */
 if (left < j)
 quickSort(arr, left, j);
 if (i < right)
 quickSort(arr, i, right);
 }
 void main()
 {
 int a[]={2,4,1,3,5,7,6};
 for(int i=0;i<7;i++)
 cout<<a;
 cout<<endl;
 quickSort(a,0,7);
 for(int j=0;j<7;j++)
 cout<<a[j];
 cout<<endl;
 }

تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 4 يوليو 2011 في 05:44

#2

هذه هي نسختك بعد التعديل:

#include<iostream>
using std::cout;

void quickSort(int** arr, int left, int right)
{
	int i = left, j = right;
	int* tmp;
	int* pivot = arr[(left + right) / 2];

	/* partition */
	while (i <= j)
	{
		while (*arr < *pivot) i++;
		while (*arr[j] > *pivot) j--;

		if (i <= j)
		{
			tmp = arr;
			arr = arr[j];
			arr[j] = tmp;
			i++;
			j--;
		}
	}

	/* recursion */
	if (left < j)
		quickSort(arr, left, j);
	if (i < right)
		quickSort(arr, i, right);

}

void main()
{
	int* a[] = {new int(10), new int(3), new int(8), new int(5), new int(4), new int(6), new int(1)};

	const int a_size = sizeof(a) / sizeof(int*);

	for(int i=0; i<a_size - 1; i++)
		cout << *a << " - ";

	cout<<*a[a_size - 1] << '\n';

	quickSort(a,0,6);

	for(int j=0; j<a_size - 1; j++)
		cout << *a[j] << " - ";

	cout<<*a[a_size - 1] << '\n';
}

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

void quickSort(int** array, int left, int right);
int* getPivot(int** array, int left, int right);


inline void sort(int** array, int length)
{ quickSort(array, 0, length - 1); }


int main()
{
    int* arr[] = {new int(10), new int(3), new int(8), new int(5), new int(4), new int(6), new int(1)};

    sort(arr, sizeof(arr)/sizeof(int));

}

void quickSort(int** array, int left, int right)
{
    do
    {
        int i = left;
        int j = right;
        int* x = getPivot(array, left, right);

        do
        {
            while (*array < *x) i++;
            while (*x < *array[j]) j--;

            if (i > j) break;
            if (i < j) { int* tmp = array; array = array[j]; array[j] = tmp; }
            i++;
            j--;
        } while (i <= j);

        if (j - left <= right - i)
        {
            if (left < j) quickSort(array, left, j);
            left = i;
        }
        else
        {
            if (i < right) quickSort(array, i, right);
            right = j;
        }
    } while (left < right);
}

int* getPivot(int** array, int left, int right)
{
    int* il = array;
    int* ir = array;
    int* im = array[left + ((right - left) >> 1)];

    bool LeftLessMid   = *il < *im;
    bool MidLessRight  = *im < *ir;
    bool RightLessLeft = *ir < *il;

    if(LeftLessMid)
    {
        if(MidLessRight) return im;
        if(RightLessLeft) return ir;
    }

    if (!RightLessLeft) return il;
    if (!MidLessRight) return im;

    return ir;
}

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 4 يوليو 2011 في 06:37

مدونتي: C++ Tips and Tricks

#3

شكرا لكل من اهتم في الموضوع

:blush:

مواضيع مشابهة