PDA

View Full Version : مبتدی: مرتب سازی



girl_shining
یک شنبه 05 اردیبهشت 1389, 23:58 عصر
با سلام
من یه برنامه مرتب سازی ادغامی میخوام بنویسم که مراحل مرتب سازی رو نشون بده
5تا عدد از کاربر بگیره و مراحل مرتب سازی رو مرحله یه مرحله تا مرحله ی آخر نشون بده خودم خیلی جستجو کردم حتی در codeproject .... خودمم تلاش کردم اما چون مبتدی هستم موفق نشدم ممکنه کمی راهنماییم کنید
ممنون

s.khoshfekran
دوشنبه 06 اردیبهشت 1389, 01:53 صبح
تابع هاش تو این فایله نوشتم main برنامه با خودت!! فقط باید call کنی متدهارو!!

girl_shining
دوشنبه 06 اردیبهشت 1389, 15:31 عصر
ممنون اما من منظورم bubble sort نبود:ناراحت:
من منظورم مرتب سازی ادغامی یا همون merge sort

bpzone
دوشنبه 06 اردیبهشت 1389, 15:37 عصر
دوست عزیز
هر کتاب طراحی الگوریتمی رو که نگاه بکنی، روش کار رو کامل برات توضیح داده، همراه با شبه کد ...
حالا شما دنبال الگوریتمی یا دنبال پیاده سازی ؟!

girl_shining
دوشنبه 06 اردیبهشت 1389, 15:51 عصر
میدونم
روش کار مرتب سازی ادغامی هم میدونم ولی میخوام با سی شارپ پیاده سازیش کنم کدهای سی شارپ هم از اینترنت در اوردم اما نمیدونم چه جوری باید روش کارشو یعنی مرحله یه مرحله مرتب سازیشو نشون بدم..منظورم اینه که علاوه بر مرتب سازی اعداد میخوام مرحله به مرحله مرتب سازی رو نشون بدم

s.khoshfekran
دوشنبه 06 اردیبهشت 1389, 15:54 عصر
http://http://www.cs.nyu.edu/~vs667/articles/mergesort/

girl_shining
دوشنبه 06 اردیبهشت 1389, 17:12 عصر
این لینکی که دوسته عزیزم گذاشتن من خودم پیدا کرده بودم و دها لینک مثه این....
منظورمو متوجه نمیشید:ناراحت:
فرض کنید این یه کد مرتب سازی ادغامیه

public MergeSorter(int[] array)
:this()
{ this.a = array;
this.x = array.Length; }
public int[] sortArray()
{ q_sort(0, x - 1); return a; }
private void q_sort(int left, int right)
{ int pivot, l_hold, r_hold;
l_hold = left;
r_hold = right;
pivot = a[left];
while
(left < right)
{ while ((a[right] >= pivot) && (left < right))
{ right--; }
if (left != right)
{ a[left] = a[right];
left++; }
while ((a[left] <= pivot) && (left < right))
{ left++; }
if (left != right)
{ a[right] = a[left]; right--; }
}
a[left] = pivot;
pivot = left;
left = l_hold;
right = r_hold;
if (left < pivot)
{ q_sort(left, pivot - 1); }
if (right > pivot)
{ q_sort(pivot + 1, right); }
}
}




من اعدادی دادم و مرتب شده برام نشون داد..من میخوام مراحل مرتب سازیشم نشونم بده

girl_shining
دوشنبه 06 اردیبهشت 1389, 17:40 عصر
اون مشکل قبلی رو بعدا حل می کنم من یه کد پیدا کردم که اعداد تصادفی تولید می کنه بعد با مرج سورت مرتب می کنه میریزه تو تکس باکس
من میخوام خودم عدد وارد کنم تو تکس باکس بعد با زدن یه دکمه مرتبش کنم
هر کاری می کنم نمیشه


private void button1_Click(object sender, EventArgs e)
{

List<int> lst = new List<int>();

for (int i1 = 0; i1 < 10; i1++)
{ lst.Add(GetRandom(20));
}
int[] array = lst.ToArray();
DoSort(array);
}
private void DoSort(int[] array) {
MergeSorter ms = new MergeSorter(array);
Func<int[]> del = new Func<int[]>(ms.sortArray);
del.BeginInvoke(new AsyncCallback(SortCallback), null);
}
private void SortCallback(IAsyncResult ar)
{ AsyncResult result = (AsyncResult)ar;
Func<int[]> del = (Func<int[]>)result.AsyncDelegate;
try {
int[] array = del.EndInvoke(ar);

this.textBox1.Invoke(new MethodInvoker(
delegate()
{ string[] sArray = array.ToList().ConvertAll<string>(Convert.ToString).ToArray();

textBox1.Text = string.Join(", ", sArray);} ));
}
catch (Exception ex)
{
this.textBox1.Invoke(new MethodInvoker(delegate()
{
textBox1.Text = "Error sorting array: " + Environment.NewLine + ex.Message;
}));
}
}


تابع رندوم باید پاک بشه بعد از کاربر 5 تا عدد بگیره از تکس باکس1 این کارو بلد نیستم(مبتدی هستم به دیده ی تمسخر به من نگاه نکنید)

s.khoshfekran
دوشنبه 06 اردیبهشت 1389, 18:06 عصر
int i = 0;
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if(e.KeyChar == Convert.ToChar(Keys.Enter) && i<10)
{
lst.Add(int.Parse(textBox1.Text));
textBox1.Text = "";
i++;
}
}

ولی اگه برای اینکارا اگه از console Application استفاده کنی راحت تری!!

girl_shining
دوشنبه 06 اردیبهشت 1389, 19:07 عصر
بی نهایت ممنون
اما بازم مشکل دارم
من توی keypress تکس باکسم این کد رو نوشتم

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
int i = 0;

List<int> lst = new List<int>();
if(e.KeyChar == Convert.ToChar(Keys.Enter) && i<10)
{
lst.Add(int.Parse(textBox1.Text));
textBox1.Text = "";
i++;
}
}


توی buttom هم این کد رو


private void button1_Click(object sender, EventArgs e)
{

List<int> lst = new List<int>();
int[] array = lst.ToArray();
DoSort(array);
}

برای صدا زدن تابع سورتم این کد رو


privatevoid DoSort(int[] array) {
MergeSorter ms = newMergeSorter(array);
Func<int[]> del = newFunc<int[]>(ms.sortArray);
del.BeginInvoke(newAsyncCallback(SortCallback), null);
}
privatevoid SortCallback(IAsyncResult ar)
{ AsyncResult result = (AsyncResult)ar;
Func<int[]> del = (Func<int[]>)result.AsyncDelegate;
try {
int[] array = del.EndInvoke(ar);

this.textBox1.Invoke(newMethodInvoker(
delegate()
{ string[] sArray = array.ToList().ConvertAll<string>(Convert.ToString).ToArray();

textBox1.Text = string.Join(", ", sArray);} ));
}
catch (Exception ex)
{
this.textBox1.Invoke(newMethodInvoker(delegate()
{
textBox1.Text = "Error sorting array: " + Environment.NewLine + ex.Message;
}));
}
}

اینم کلاس سورتم


public class MergeSorter {
private int[] a;
// number of elements in array
private int x;
//
private MergeSorter()
{
}
public MergeSorter(int[] array)
:this()
{ this.a = array;
this.x = array.Length; }
public int[] sortArray()
{ q_sort(0, x - 1); return a; }
private void q_sort(int left, int right)
{ int pivot, l_hold, r_hold;
l_hold = left;
r_hold = right;
pivot = a[left]; --------------------> اینجا ارور میده
while
(left < right)
{ while ((a[right] >= pivot) && (left < right))
{ right--; }
if (left != right)
{ a[left] = a[right];
left++; }
while ((a[left] <= pivot) && (left < right))
{ left++; }
if (left != right)
{ a[right] = a[left]; right--; }
}
a[left] = pivot;
pivot = left;
left = l_hold;
right = r_hold;
if (left < pivot)
{ q_sort(left, pivot - 1); }
if (right > pivot)
{ q_sort(pivot + 1, right); }
}
}


}
}

چیکار کنم؟؟؟؟؟؟؟؟ لطفا کمکم کنید

arefba
دوشنبه 06 اردیبهشت 1389, 22:41 عصر
خطا رو بنویسید
چون ممکنه بچه ها نتونن برنامه رو تست کنن