كيف يمكنني فرز مجموعة من المؤشرات المزدوجة بناءً على القيم التي تشير إليها؟
سؤال
أحاول إنشاء وظيفة في 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؟الأمراض المنقولة جنسيا::خريطة؟).