עבור לתוכן

שאלה בC++ מערכים

Featured Replies

פורסם

שלום,

צריך לכתוב פונצקיה הקולטת מערך של מספרים שלמים ואת גודלו ומשנה את סדר הנתונים במערך כך שקודם יופיעו כל המספרים השליליים ואחריהם כל האי שליליים.

void splitArray(int arr[], int size);

מישהו שיכול להגיד לי איך עושים את זה?

תודה מראש =]

פורסם

תחזיק שני אינדקסים - אחד המצביע לתחילת המערך, ואחד המצביע לסופו.

תעבור על המערך, וכל פעם "תדחוף" את המספר הנוכחי למקום המתאים (תחילת המערך או סופו).

פורסם

יש כמה דרכים אחת הפשוטות (בהינתן זה שלא הגבילו אותך בשיעורי בית או משהו..)

זה פשוט ליצור עוד מערך באותו גודל

int blah = (int*) malloc(sizeof(int)*size)p

עכשיו blah הוא מערך של int בגודל size

עכשיו תעבור על המערך שלך איבר איבר וכל פעם שהגעת לאיבר שלילי תכניס אותו למקום הראשון במערך החדש ואז תקדם אינדקס על המערך החדש שתדע איפה האיבר האחרון.

אחרי שעברת על כל המערך הרגיל תעבור עליו שוב וכל פעם שאתה מגיע למספר אישלילי תכניס אותו למערך החדש לפי האינדקס ותקדם את האינדקס.

ובסוף תעתיקאת כל המערך החדש למערך הישן.

כמובן שזו דרך טריוויאלית ללא מיון ולא כלום אבל עובדת.

דרך יותר יפה טיפה יותר מסובכת בהבנה אבל המימוש לא הרבה יותר קשה היא כזו:

תאתחחל 2 אינדקסים i,k אחד מאותחל ל0 השני לsize

תלך מתחילת המערך ותקדם את האינדקס עד שתמצא את האיבר האישלילי הראשון ברגע שמצאת אותו עצור

תלך מסוף המערך ותקטין את האינדקס עד שתמצא את האיבר השלילי הראשון ברגע שמצאת תבדוק

האם האינדקס השני קטן מהאינדקס הראשון אם כן תחזיר את המערך שלך כי הוא כבר ממויין כפי שביקשו

אם לא החלף בין 2 האיברים שנמצאים באינדקסים וחזור לתחילת הלולאה.

פורסם

יש כמה דרכים אחת הפשוטות (בהינתן זה שלא הגבילו אותך בשיעורי בית או משהו..)

זה פשוט ליצור עוד מערך באותו גודל

int blah = (int*) malloc(sizeof(int)*size)p

עכשיו blah הוא מערך של int בגודל size

עכשיו תעבור על המערך שלך איבר איבר וכל פעם שהגעת לאיבר שלילי תכניס אותו למקום הראשון במערך החדש ואז תקדם אינדקס על המערך החדש שתדע איפה האיבר האחרון.

אחרי שעברת על כל המערך הרגיל תעבור עליו שוב וכל פעם שאתה מגיע למספר אישלילי תכניס אותו למערך החדש לפי האינדקס ותקדם את האינדקס.

ובסוף תעתיקאת כל המערך החדש למערך הישן.

כמובן שזו דרך טריוויאלית ללא מיון ולא כלום אבל עובדת.

דרך יותר יפה טיפה יותר מסובכת בהבנה אבל המימוש לא הרבה יותר קשה היא כזו:

תאתחחל 2 אינדקסים i,k אחד מאותחל ל0 השני לsize

תלך מתחילת המערך ותקדם את האינדקס עד שתמצא את האיבר האישלילי הראשון ברגע שמצאת אותו עצור

תלך מסוף המערך ותקטין את האינדקס עד שתמצא את האיבר השלילי הראשון ברגע שמצאת תבדוק

האם האינדקס השני קטן מהאינדקס הראשון אם כן תחזיר את המערך שלך כי הוא כבר ממויין כפי שביקשו

אם לא החלף בין 2 האיברים שנמצאים באינדקסים וחזור לתחילת הלולאה.

הפתרון השני שלך הוא הפתרון הידוע והמקובל

למי שלא יודע זה פעולה שקוראים לה partition והיא חלק מהquicksort

רק ששם זה לא שליליים ואי שליליים אלא מעל מספר מסויים ומתחתיו

תוכל למצוא אלף פתרונות באינטרנט לאלגוריתם הזה

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים