נושאים פעיליםנושאים פעילים  הצגת רשימה של חברי הפורוםרשימת משתמשים  חיפוש בפורוםחיפוש  עזרהעזרה
  הרשמההרשמה  התחברותהתחברות RSS עדכונים
תיכנות
RSS UnderWarrior Forums : RSS תיכנות
נושא

נושא: עזרה בשפת c

שליחת תגובהשליחת נושא חדש
כותב
הודעה << נושא קודם | נושא הבא >>
לינור
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 06 February 2009 בשעה 22:52 | IP רשוּם
ציטוט לינור

שפת-c   

 

שלום!

 

אני צריכה עזרה דחופה במערכים (הסתבכתי...........בכלל לא יודעת איך להתחיל)

 

 

כתוב פונקציה SortArray שמקבלת מערך חד-מימדי של מספרים שלמים בגודל N וממיינת אותו כך שמספרים הזוגיים יהיו בהתחלה והלא-זוגיים יהיו בסוף המערך , למשל,

עבור מערך

14 13 15 20 18 19 20

 

המיון יראה כך:

14 20 18 30 13 15 19

 

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

     (יש  לבנות אותה)PrintArray התוכנית תדפיס את המערך המעודכן בעזרת פונקציה נוספת

 

תודה רבה לכל העונה!!!

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

הצטרף / הצטרפה: 11 November 2005
מדינה: Israel
משתמש: מנותק/ת
הודעות: 354
נשלח בתאריך: 07 February 2009 בשעה 08:54 | IP רשוּם
ציטוט yohai

במה הסתבכת???

תגידי לנו  איפה הבעיה שלך...

איך ניסית לפתור את השאלה....???

חזרה לתחילת העמוד הצג את כרטיס החבר של yohai חפש הודעות אחרות של yohai בקר בדף הבית של yohai
 
ארנון
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 07 February 2009 בשעה 10:31 | IP רשוּם
ציטוט ארנון

פתרון אפשרי (לא שיא היעילות, אבל די פשוט):
1. תסרקי את המערך ותמני כמה מספרים זוגיים יש בו, וכמה מספרים אי-זוגיים (לדוגמה המשתנה count1 ימנה את מספר המספרים הזוגיים, ו- count2 את מספר המספרים האי-זוגיים).
2. תגדירי 2 מערכים חדשים, אחד בשביל המספרים הזוגיים שגודלו count1 , ואחד בשביל האי-זוגיים שגודלו count2
3. מכאן, תריצי מיון בועות (או כל מיון אחר) על כל אחד מהמערכים שהגדרת.
4. חברי את המערכים למערך חדש/למערך הישן לפי הסדר- קודם יבוא המערך הממויין של המספרים הזוגיים ולאחריו המערך הממויין של המספרים האי זוגיים.
חזרה לתחילת העמוד הצג את כרטיס החבר של ארנון חפש הודעות אחרות של ארנון בקר בדף הבית של ארנון
 
גרשון
משתמש מתחיל
משתמש מתחיל
סמל אישי

הצטרף / הצטרפה: 19 February 2009
מדינה: Israel
משתמש: מנותק/ת
הודעות: 6
נשלח בתאריך: 19 February 2009 בשעה 22:54 | IP רשוּם
ציטוט גרשון

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

(אין צורך למיין לאחר ההפרדה).

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

כך : המערך של הזוגיים מתחיל מ אפס ועולה , המערך של האי זוגיים מתחיל מ 1-N ויורד

מגדירים משתנה שמצביע על סוף המערך (ערכו ההתחלתי יהיה 1-N).

רצים על המערך (המקורי) מ אפס ועד 1-N ועבור כל תוכן נוכחי בודקים האם הוא אי זוגי,

דרך אפשרית בקוד : ( if (array[i] & 1   

מכאן משאיר לך את המימוש...

חזרה לתחילת העמוד הצג את כרטיס החבר של גרשון חפש הודעות אחרות של גרשון
 
שמואל
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 28 February 2009 בשעה 00:20 | IP רשוּם
ציטוט שמואל

שלום,

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

קוד:
void sortOddEven(int[] array, int size)
{
 //hold a pointer to the begining of the array
 int *leftPtr = array;

 //hold a pointer to the end of the array
 int *rightPtr = &(array[size - 1]);

 //hold a swap helper
 int swapHelper;

 //loop while leftPtr is bigger the rightPtr.
 //the condition considers the fact that leftPtr an rightPtr can be
 //updated simultaneously.   
 while(leftPtr > rightPtr)
 {
  //swap values if leftPtr point to an odd number and rightPtr point to an even number
  if (!((*leftPtr) % 2) && ((*rightPtr) % 2))
  {
   swapHelper = *leftPtr;
   *leftPtr = *rightPtr;
   *rightPtr = swapHelper;
   
   //move to the next values and continue
   leftPtr++;
   rightPtr--;
   continue;
  }

  //move leftPtr to the next memmory address if it
  //points to an even value
  if ((*leftPtr) % 2)
   leftPtr++;

  
  //move rightPtr to the previous memmory address if it
  //points to an odd value
  if (!(*rightPtr) % 2)
   rightPtr--;
 }
}

 

הפתרון הזה ירוץ במקרה הגרוע ביותר כסדר גודל n (גודל המערך), ובמקרה הטוב ביותר n/2 פעמים. צריך להבין כי פקטור חצי כאשר מדובר בסדרי ריצה אינו משנה את יעילות האלגוריתם ועדין מחשיב אותו כסדר גודל n, אך עם זאת תמיד טוב לחסוך בזמני ריצה...  

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

חזרה לתחילת העמוד הצג את כרטיס החבר של שמואל חפש הודעות אחרות של שמואל בקר בדף הבית של שמואל
 
שמואל
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 28 February 2009 בשעה 00:26 | IP רשוּם
ציטוט שמואל

עוד דבר קטן, אין צורך במשפטים הבאים בתוך התנאי הראשון -

קוד:
//move to the next values and continue
   leftPtr++;
   rightPtr--;
   continue;

האלגוריתם תיאורטית אמור לעבוד גם בלעדיהם.

בהצלחה.

 

חזרה לתחילת העמוד הצג את כרטיס החבר של שמואל חפש הודעות אחרות של שמואל בקר בדף הבית של שמואל
 

אם ברצונך להגיב לנושא זה עליך קודם להתחבר
אם אינך רשום/ה כבר עליך להרשם

  שליחת תגובהשליחת נושא חדש
גרסת הדפסה גרסת הדפסה

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