مرتب سازي شمارشي ساختمان داده ها سميرا قانوني زهرا معدني پاييز 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;
‫‪‬پايان‬