مرتب سازي شمارشي ساختمان داده ها سميرا قانوني زهرا معدني پاييز 88 تعريف كلي مرتبساز شمارشی يکی از الگوريتمهای مرتبسازی است با فرض دانستن بازه.
Download
Report
Transcript مرتب سازي شمارشي ساختمان داده ها سميرا قانوني زهرا معدني پاييز 88 تعريف كلي مرتبساز شمارشی يکی از الگوريتمهای مرتبسازی است با فرض دانستن بازه.
مرتب سازي شمارشي
ساختمان داده ها
سميرا قانوني
زهرا معدني
پاييز 88
تعريف كلي
مرتبساز شمارشی يکی از الگوريتمهای مرتبسازی
است با فرض دانستن بازه اعداد داخل آرايه ( ،)Aعمل
مرتبسازی را انجام میدهد .اين الگوريتم از اين بازه
برای ساختن يک آرايه ( )Cبا اين طول استفاده میکند.
هر انديس iدر آرايه Cبرای شمارش تعداد عناصر Aکه
دارای مقدار iهستند ،به کار میرود .اين اعداد در C
برای قرار دادن عناصر Aدر جای درستشان در آرايه
خروجی ،به کار میروند.
ويژگیها
ويژگیهای مرتبساز شمارشی
مرتبساز شمارشی ،يک مرتبساز پايدار است و دارای زمان اجرای
( o(n+kاست که nو kبه ترتيب ،طولهای آرايههای ( Aآرايه ورودی)
و ( Cآرايه شمارشی) هستند .برای اين که الگوريتم ،کارآمد باشد k ،نبايد
خيلی بيشتر از nباشد .انديسهای ،Cبايد از کوچکترين تا بزرگترين
عناصر Aباشند تا بتوان Cرا به صورت مستقيم با مقادير ،A
انديسگذاری کرد .در غير اين صورت ،مقادير Aبايد انتقال (شيفت) داده
شوند تا کمترين مقدار ،Aمعادل کوچکترين انديس Cشود .اگر بيشتری و
کمترين مقادير Aمعلوم نباشند ،بايد توسط يک الگوريتم انتخاب ،که زمان
(o)nمیگيرد ،آنها را پيدا کرد .طول آرايه شمارشی ،Cحداقل بايد برابر
بازه اعداد ورودی باشد( .کمترين منهای بيشتری و بهاضافه .)1اين
ويژگی باعث میشود که استفاده از مرتبساز شمارشی برای بازههای
بزرگ اعداد ،غيرعملی شود .مرتبساز شمارشی ،برای مثال ،میتواند
بهترين الگوريتم برای اعدادی باشد که بين 0و 100قرار دارند .اين
الگوريتم برای مرتب کردن اسامی بر اساس حروف الفبا ،نامناسب است.
به علت اينکه مرتبساز شمارشی ،از مقادير به عنوان انديس آرايه استفاده
میکند ،يک الگوريتم مرتبساز مقايسهای ،نيست.
الگوريتم مرتب سازي
الگوريتم
-1کوچکترين و بزرگترين عناصر مجموعه را
پيدا کن.
-2مقادير مختلف موجود در آرايه را بشمار.
(برای مثال ،مجموعه [ ]4،4،4،1،1دارای سه
تا 4و دو تا 1است)
-3شمارشها را جمع کن.
-4آرايه مقصد را از انتها پر کن :هر عنصر را
در موقعيت countام قرار بده.
-5هر موقع که عنصری را درج میکنی،
شمارشش را يکی کم کن.
Counting Sort
Counting-sort(A[1..n]) //A is an integer array
for i←1 to k // k = max(A[1..n])
do C[i[ ←0
for j←1 to n
do C[A[j[[ ←C[A[j]] + 1
for i←2
to k
do C[i[ ←C[i] + C[i–1]
for j←n downto 1
do B[C[A[j[[[ ←A]j]
C[A[j[[ ←C[A[j]] –1
//C[i] = |{key = i}|
//C[i[ = |{key ≤i}|
Counting Sort - Example
تعداد شمارش
4
3
2
آرايه ورودي
1
C
5
4
3
2
1
3
4
3
1
4
A
خروجي
5
4
3
2
1
B
Loop 1: Initialization
1
2
3
4
5
4
1
3
4
3
A
C
1
B
2
3
4
5
1
0
2
0
for i=1 to k
C[i]= 0
3
0
4
0
Loop 2: Counting …
1
2
3
4
5
A
1
4
1
3
4
2
4
1
3
3
4
1
4
4
5
4
for
3
1
0
2
0
3
0
4
1
4
3
1
0
0
1
3
4
3
1
0
1
1
1
3
4
3
1
0
1
2
1
3
4
3
1
0
2
2
C
j←1 to
n
do C[A]j[[ ←C[A[j]] + 1// C[k] = |{key = k}|
Loop 3: Cumulating…
A
B
for
1
2
3
4
5
4
1
3
4
3
C
C’
1
2
3
4
1
0
2
2
1
1
2
1
3
2
4
2
1
1
2
1
3
3
4
2
1
1
2
1
3
3
4
5
j←2 to k
do C]j[ ←C[j] + C[j -1]// C[k] = |{key <= k}|
Loop 4: Placement…
1
2
3
4
5
4
1
3
4
3
A
1
B
2
3
3
4
C
1
1
2
1
3
3
4
5
C’
1
1
2
1
3
2
4
5
5
for j←n downto 1
do B[C[A [j[[[ ←A]j]//Place A[j]
C[A[ j[[ ←C[A [j]] –1 // Decrement C[A [j]]
Loop 4: Placement…
1
2
3
4
5
4
1
3
4
3
A
1
B
2
3
3
4
5
4
C
1
1
2
1
3
2
4
5
C’
1
1
2
1
3
2
4
4
for j←n downto 1
do B[C[A[j[[[ ←A]j] //Place A[j]
C[A[j[[ ←C[A[j]] –1 // Decrement C[A[j]]
Loop 4: Placement…
1
2
3
4
5
4
1
3
4
3
A
1
B
2
3
3
3
4
5
4
C
1
1
2
1
3
3
4
5
C’
1
1
2
1
3
1
4
4
for j←n downto 1
do B[C[A[j[[[ ←A]j] //Place A[j]
C[A[j[[ ←C[A[j]] –1 // Decrement C[A[j]]
Loop 4: Placement…
1
2
3
4
5
4
1
3
4
3
A
B
1
1
2
3
3
3
4
5
4
C
1
1
2
1
3
3
4
5
C’
1
0
2
1
3
1
4
4
for j←n downto 1
do B[C[A[j[[[ ←A]j] //Place A[j]
C[A[j[[ ←C[A[j]] –1 // Decrement C[A[j]]
Loop 4: Placement…
1
2
3
4
5
4
1
3
4
3
A
B
1
1
2
3
3
3
4
4
5
4
C
1
1
2
1
3
3
4
5
C’
1
0
2
1
3
1
4
3
for j←n downto 1
do B[C[A[j[[[ ←A]j] //Place A[j]
C[A[j[[ ←C[A[j]] –1 // Decrement C[A[j]]
آناليز الگوريتم
Loop1 :Θ(k)
–
Loop 2 :Θ(n)
–
for j←1 to n do C[A]j[[ ←C[A[j]] + 1// C[k] = |{key = k}|
Loop 3: Θ(k)
–
for i=1 to k do C[i]= 0 :
for j←2
Loop 4:Θ(n)
–
for j←n downto1
to k do C]j[ ←C[j] + C[j -1]// C[k] = |{key <= k}|
do
B[C[A[j[[[ ←A]j]
C[A[j[[ ←C[A[j]] –1
Tootal: Θ(k + n)
پايدار
•الگوريتم Counting Sort
در صورتي كه دو عضو
آرايه كليد مساوي داشته
باشند ،ترتيب آنها را حفظ مي
كند .اين نوع الگوريتم را
مرتب سازي پايدار مي نامند
5
4
3
2
1
3
4
3
1
4
A
5
4
4
4
3
3
2
3
1
1
B
خالصه
نام conting sort
بهترين o(n+k):
بدترين o(n+k):
حافظه o(n+k):
پايدار :بله
مقايسه اي :خير
روش indexing
c++پياده سازي با
void counting_sort(int *nums, int size)
{
int i, min = nums[0], max = min;
for(i = 1; i < size; ++i)
{
if (nums[i] < min)
min = nums[i];
else if (nums[i] > max)
max = nums[i];
}
c++پياده سازي با
for(i=0; i<size; ++i)
++counts[ nums[i] - min ];
int j=0;
for(i=min; i<=max; i++)
for(int z=0; z<counts[i-min]; z++)
nums[j++] = i;
delete[] counts;
}
int distinct_element_count = max - min + 1;
int[] counts = new int[distinct_element_count];
for(i=0; i<distinct_element_count; ++i)
counts[i] = 0;
پايان