PDA

View Full Version : سورت کردن اطلاعاتی که بیشترشان سورت شده اسا



FastCode
جمعه 27 آذر 1388, 13:22 عصر
سلام.
من یک سری اطلاعات به صورت پشت سر هم توی حافظه دارم.
یدونه لیست از مکان های مرتب شده می خواهم.
مثل این:
0010 043204320ab3df
0020 04789bca78df98
0040 070983248dce89
0030 043204320ab3df
همه طول مساوی دارند.

جواب مثال میشه 1,2,4,3

این لیستی که راجع بهش حرف میزنم 100,000*100 byte طولشه.:گریه:

FastCode
شنبه 28 آذر 1388, 16:23 عصر
سعی کردم از merge sort استفاده کنم ولی فکر میکنم ممکن stack overflow exception بده.
نظر شما چیه؟
کسی تا حالا از merge sort استفاده کرده؟

FastCode
دوشنبه 28 دی 1388, 14:55 عصر
باید بگم که بلاخره موفق شدم.با merge sort
با یه ورژن optimize شده :
memory (n * ((log n) - 2))
CPU (n * log n)
هر کس میخواد بگه بفرستم.

mortezamsp
سه شنبه 29 دی 1388, 19:16 عصر
بهر حال بزار ببینیم دیگه !:تشویق:

FastCode
چهارشنبه 30 دی 1388, 18:15 عصر
if (Rs.Length > 1)
mergeSort(ref Rs);

private static void mergeSort(ref IIndex[] d)
{
int n = d.Length;
switch (n)
{
case 2:
if (d[0].Index > d[1].Index)
{
IIndex r = d[0];
d[0] = d[1];
d[1] = r;
}
break;
case 3:
if (d[0].Index > d[1].Index)
{
IIndex r = d[0];
d[0] = d[1];
d[1] = r;
}
if (d[1].Index > d[2].Index)
{
IIndex r = d[1];
d[1] = d[2];
d[2] = r;
if (d[0].Index > d[1].Index)
{
IIndex r_ = d[0];
d[0] = d[1];
d[1] = r_;
}
}
break;
default:
int i;
int j = 0;
int k = 0;
int Half1 = n >> 1;
int Half2 = n - Half1;
IIndex[] arr1 = new IIndex[Half1];
IIndex[] arr2 = new IIndex[Half2];
j = 0;
for (i = 0; i != Half1; i++) arr1[i] = d[j++];
for (i = 0; i != Half2; i++) arr2[i] = d[j++];
mergeSort(ref arr1);
mergeSort(ref arr2);
i = j = 0;
while (Half1 != j && Half2 != k) if (arr1[j].Index <= arr2[k].Index) d[i++] = arr1[j++]; else d[i++] = arr2[k++];
while (Half1 != j) d[i++] = arr1[j++];
while (Half2 != k) d[i++] = arr2[k++];
break;
}
}
interface IIndex { int Index { get; } }