كيف يمكنني فرز مجموعة من المؤشرات المزدوجة بناءً على القيم التي تشير إليها؟

StackOverflow https://stackoverflow.com/questions/17299

سؤال

أحاول إنشاء وظيفة في C/C++ لفرز مصفوفة واستبدال كل قيمة بـ "نقاطها" أو رتبتها.يأخذ مصفوفة مؤشر مزدوج إلى مصفوفة من ints، ويفرز المؤشرات المزدوجة بناءً على القيمة التي تم إلغاء الإشارة إليها للأعداد الصحيحة.لقد حاولت عدة مرات أن أجعله يعمل، لكن لم أتمكن من ذلك.مرة أخرى، يجب عليه فرز المؤشرات المزدوجة بناءً على القيم التي تشير إليها.هذا ما لدي:

void SortArray( int ** pArray, int ArrayLength )
{
  int i, j, flag = 1;     // set flag to 1 to begin initial pass
  int * temp;             // holding variable orig with no *
  for(i = 1; (i <= ArrayLength) && flag; i++)
  {
    flag = 0;
    for (j = 0; j < (ArrayLength -1); j++)
    {
        if (*pArray[j+1] > *pArray[j])    // ascending order simply changes to <
        { 
            temp = &pArray[j];            // swap elements
            pArray[j] = &pArray[j+1];
            pArray[j+1] = &temp;
            flag = 1;                     // indicates that a swap occurred.
        }
    }
  }
}
هل كانت مفيدة؟

المحلول

انت قريب.أنت تشير إلى عنوان عناصر المصفوفة عند المبادلة، وهذا ليس ضروريًا.العناصر الموجودة في المصفوفة هي مؤشرات، وهذا ما يجب تبديله.

انظر أدناه:

void SortArray( int ** pArray, int ArrayLength )
{
    int i, j, flag = 1;    // set flag to 1 to begin initial pass
    int * temp;             // holding variable orig with no *
    for(i = ArrayLength - 1; i > 0 && flag; i--)
    {
        flag = 0;
        for (j = 0; j < i; j++)
        {
            if (*pArray[j] > *pArray[j+1])      // ascending order simply changes to <
            { 
                temp = pArray[j];             // swap elements
                pArray[j] = pArray[j+1];
                pArray[j+1] = temp;
                flag = 1;               // indicates that a swap occurred.
            }
        }
    }
}

أيضا، تحقق من هذه التدوينة الجميلة حول Bubble Sorting في حال كنت مهتما (آسف، المكونات وقح :)).نأمل أن يساعدك في واجبك المنزلي ;)


يحرر:لاحظ "التحسين" الدقيق حيث تقوم بالعد التنازلي من طول المصفوفة وتزيد فقط حتى "i" في الحلقة الداخلية.وهذا يوفر عليك إعادة تحليل العناصر التي تم فرزها بالفعل دون داع.

نصائح أخرى

هههه هذا ليس واجب منزلي

إذا كان الأمر كذلك، ففكر في استخدام STL لإدارة المصفوفات وفرزها.من الأسهل تطويرها وصيانتها، كما أن خوارزمية std::sort أسرع بشكل غير مقارب من فرز الفقاعات.

يجب أن تفكر في استخدام std::swap() للقيام بالتبديل الخاص بك.إذا فعلت ذلك، سمها هكذا:

swap( obj1, obj2 );

بدلا من:

std::swap( obj1, obj2 );

نظرًا لأن دلالي الاستدعاء الأول سيسمح بالبحث المناسب عن مساحة الاسم للعثور على التحميل الزائد الصحيح في حالة وجوده.تأكد من وجود إما:

using namespace std;

أو:

using std::swap;

مكان ما.

حسنًا، ليس لدي الكثير من الخبرة مع المحكمة الخاصة بلبنان.هل يمكن أن تعطي مثالا؟

يقوم هذا البرنامج بإنشاء متجه من ints، وفرزه، وعرض النتائج.

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

int main()
{
    vector<int>; vec;
    vec.push_back(7);
    vec.push_back(5);
    vec.push_back(13);
    sort(vec.begin(), vec.end());

    for (vector<int>::size_type i = 0; i < vec.size(); ++i)
    {
        cout << vec[i] << endl;
    }
}

لإكمال مشاركة براين إنسينك، ستجد المحكمة الخاصة بلبنان مليئة بالمفاجآت.على سبيل المثال، خوارزمية std::sort:

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

void printArray(const std::vector<int *> & p_aInt)
{
   for(std::vector<int *>::size_type i = 0, iMax = p_aInt.size(); i < iMax; ++i)
   {
      std::cout << "i[" << static_cast<int>(i) << "] = " << reinterpret_cast<unsigned     int>(p_aInt[i]) << std::endl ;
   }

   std::cout << std::endl ;
}


int main(int argc, char **argv)
{
   int a = 1 ;
   int b = 2 ;
   int c = 3 ;
   int d = 4 ;
   int e = 5 ;

   std::vector<int *> aInt ;

   // We fill the vector with variables in an unordered way
   aInt.push_back(&c) ;
   aInt.push_back(&b) ;
   aInt.push_back(&e) ;
   aInt.push_back(&d) ;
   aInt.push_back(&a) ;

   printArray(aInt) ; // We see the addresses are NOT ordered
   std::sort(aInt.begin(), aInt.end()) ; // DO THE SORTING
   printArray(aInt) ; // We see the addresses are ORDERED

   return EXIT_SUCCESS;
}

ستعرض الطباعة الأولى للمصفوفة عناوين غير مرتبة.والثاني، بعد الفرز، سيُظهر العناوين المطلوبة.في المترجم الخاص بي، لدينا:

i[0] = 3216087168
i[1] = 3216087172
i[2] = 3216087160
i[3] = 3216087164
i[4] = 3216087176

i[0] = 3216087160
i[1] = 3216087164
i[2] = 3216087168
i[3] = 3216087172
i[4] = 3216087176

قم بإلقاء نظرة على رأس <algorithm> الخاص بـ STL http://www.cplusplus.com/reference/algorithm/ستجد الكثير من المرافق.لاحظ أن لديك تطبيقًا آخر للحاويات التي قد تناسبك بشكل أفضل (std::list؟الأمراض المنقولة جنسيا::خريطة؟).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top