Search This Blog

2010-05-26

Quick sort (Асуудалтай хурдан эрэмбэлэлт)

Зээ би гэдэг хүн өдрийн сайныг өнжин хүлээж, сарын сайныг саатан хүлээж байгаад нэг өдрийг нь өлзий хишиг нь дэлгэрсэн сайн гэж итгэн QUICK SORT (хурдан эрэмбэлэлт) -оо эхлүүлсэн бөлгөө. Гэтэл лүд юм шиг буруу өдөр л байж таарав бололтой, өнөөх хурдан эрэбэлэлт маань өдгөө хүртэл үр дүнгээ хялайлгасангүй ээ. Заа ингээд буруу зөрүүг нь олохоор унтаж идэхээ умартах нь ч хаашаа юм зүгээр, гэхдээ л бодоод бодоод бодын шийр 4 гээч нь болчих бололтой юмаа.  Ухааны нь олж эс ядаад та бүхнээсээ асууя уу хэмээн сэтгэл шулуудсан учир бичсэн хэдэн мөр зүйлээ доор сийрүүлвэй. Бурууг нь тунгаан, зөрүүг нь арилгаж хайрлаач ээ.

Зээ алдаа нь болбоос 100 өгөдөл дээр ( эрэмбэлэгдээгүй ) зүгээр, 1000 болоод ирэхээрээ ажиллаад байгаа нь мэдэгдэхгүй, ажиллахгүй байгаа нь мэдэгдэхгүй болчих юмаа.

Hoare -н partition хуваах аргыг ашигласан бөлгөө.
За ингээд код нь болбоос

int partition( int a[ ], int low, int high )
{
    int piwot, right, left;
    left = low + 1 ;
    right = high ;
    piwot = a[ low ];
    while(1)
    {
        while( a[ right ] > piwot ) right--;
        while( a[ left ] < piwot && left < high ) left++;
        if ( left < right )
            swap( a, left, right );
        else{
            swap( a, low, right );
            return right;
        }
    }
}

void quickSort( int a[ ], int low, int high)
{
    int part;
    if( low < high )
    {
        part = partition( a, low, high );
        quickSort( a, low, part -1 );
        quickSort( a, part +1, high );
    }
}

4 comments:

... said...

Доорх ЖАВА кодыг ажилуулж үздээ


int pivot(int[] a,int i,int j){
int k=i+1;
while(k<=j && a[i]==a[k]) k++;
if(k>j) return -1;
if(a[i]>=a[k]) return i;
return k;
}


int partition(int[] a,int i,int j,int x){
int l=i,r=j;


while(l<=r){
while(l<=j && a[l]=i && a[r]>=x) r--;
if(l>r) break;
int t=a[l];
a[l]=a[r];
a[r]=t;
l++; r--;
}
return l;
}


public void quickSort(int[] a,int i,int j){
if(i==j) return;
int p=pivot(a,i,j);
if(p!=-1){
int k=partition(a,i,j,a[p]);
quickSort(a,i,k-1);
quickSort(a,k,j);
}
}


public void sort(int[] a){
quickSort(a,0,a.length-1);
}

... said...

ойрд яагад эрэмбэлээд байна даа аан

... said...

era of sort?

Anonymous said...

Жаа би ажиллуулж үжьеэ. Эрэмбэлэх, хайх бол ямарч програмд зайлшгүй хэрэгтэй зүйл бөлгөө. 2тын модны эрэмбэлэлт оруулюуу гэж бодоод байх юмдаа. Миний блогоор орж ирж гэгээн дүрээ үзүүлсэн баярласуу

Зурхай