Download presentation
Presentation is loading. Please wait.
1
سميرا قانوني زهرا معدني
مرتب سازي شمارشي ساختمان داده ها سميرا قانوني زهرا معدني پاييز 88
2
تعريف كلي مرتبساز شمارشی یکی از الگوریتمهای مرتبسازی است با فرض دانستن بازه اعداد داخل آرایه (A)، عمل مرتبسازی را انجام میدهد. این الگوریتم از این بازه برای ساختن یک آرایه (C) با این طول استفاده میکند. هر اندیس i در آرایه C برای شمارش تعداد عناصر A که دارای مقدار i هستند، به کار میرود. این اعداد در C برای قرار دادن عناصر A در جای درستشان در آرایه خروجی، به کار میروند.
3
ویژگیها ویژگیهای مرتبساز شمارشی
مرتبساز شمارشی، یک مرتبساز پایدار است و دارای زمان اجرای (o(n+k است که n و k به ترتیب، طولهای آرایههای A (آرایه ورودی) و C (آرایه شمارشی) هستند. برای این که الگوریتم، کارآمد باشد، k نباید خیلی بیشتر از n باشد. اندیسهای C، باید از کوچکترین تا بزرگترین عناصر A باشند تا بتوان C را به صورت مستقیم با مقادیر A، اندیسگذاری کرد. در غیر این صورت، مقادیر A باید انتقال (شیفت) داده شوند تا کمترین مقدار A، معادل کوچکترین اندیس C شود. اگر بیشتری و کمترین مقادیر A معلوم نباشند، باید توسط یک الگوریتم انتخاب، که زمان (n)oمیگیرد، آنها را پیدا کرد. طول آرایه شمارشی C، حداقل باید برابر بازه اعداد ورودی باشد. (کمترین منهای بیشتری و بهاضافه 1). این ویژگی باعث میشود که استفاده از مرتبساز شمارشی برای بازههای بزرگ اعداد، غیرعملی شود. مرتبساز شمارشی، برای مثال، میتواند بهترین الگوریتم برای اعدادی باشد که بین 0 و 100 قرار دارند. این الگوریتم برای مرتب کردن اسامی بر اساس حروف الفبا، نامناسب است. به علت اینکه مرتبساز شمارشی، از مقادیر به عنوان اندیس آرایه استفاده میکند، یک الگوریتم مرتبساز مقایسهای، نیست.
4
الگوريتم مرتب سازي الگوریتم
1-کوچکترین و بزرگترین عناصر مجموعه را پیدا کن. 2-مقادیر مختلف موجود در آرایه را بشمار. (برای مثال، مجموعه [4،4،4،1،1] دارای سه تا 4 و دو تا 1 است) 3-شمارشها را جمع کن. 4-آرایه مقصد را از انتها پر کن: هر عنصر را در موقعیت count ام قرار بده. 5-هر موقع که عنصری را درج میکنی، شمارشش را یکی کم کن.
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 //C[i] = |{key = i}| for i←2 to k do C[i] ←C[i] + C[i–1] //C[i] = |{key ≤i}| for j←n downto 1 do B[C[A[j]]] ←A[j] C[A[j]] ←C[A[j]] –1
6
Counting Sort - Example
تعداد شمارش آرايه ورودي C 1 2 3 4 5 A 1 2 3 4 خروجي B 1 2 3 4 5
7
Loop 1: Initialization A C for i=1 to k C[i]= 0 B 1 2 3 4 5 1 2 3 4 1
A C 1 2 3 4 5 for i=1 to k C[i]= 0 B
8
Loop 2: Counting … C A 1 2 3 4 5 for j←1 to n
A 1 4 1 3 2 1 3 4 1 3 1 4 4 1 3 1 2 5 4 1 3 1 2 for j←1 to n do C[A[j]] ←C[A[j]] + 1// C[k] = |{key = k}|
9
Loop 3: Cumulating… A C C’ B for j←2 to k
1 2 3 4 5 1 2 3 4 C’ B 1 2 3 4 1 2 3 4 1 2 3 4 5 for j←2 to k do C[j] ←C[j] + C[j -1]// C[k] = |{key <= k}|
10
Loop 4: Placement… A C B C’ for j←n downto 1
2 3 4 5 1 2 3 4 5 A C 1 2 3 4 5 1 2 3 4 5 B C’ 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]]
11
Loop 4: Placement… A C B C’ for j←n downto 1
2 3 4 5 1 2 3 4 5 A C 1 2 3 4 5 1 2 3 4 B C’ 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]]
12
Loop 4: Placement… A C B C’ for j←n downto 1
2 3 4 5 1 2 3 4 5 A C 1 2 3 4 5 1 2 3 4 B C’ 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]]
13
Loop 4: Placement… A C B C’ for j←n downto 1
2 3 4 5 1 2 3 4 5 A C 1 2 3 4 5 1 2 3 4 B C’ 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]]
14
Loop 4: Placement… A C B C’ for j←n downto 1
2 3 4 5 1 2 3 4 5 A C 1 2 3 4 5 1 2 3 4 B C’ 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]]
15
آناليز الگوريتم Loop 4:Θ(n) Loop1: Θ(k) Loop 2 :Θ(n) Loop 3: Θ(k)
for i=1 to k do C[i]= 0 : Loop 2 :Θ(n) for j←1 to n do C[A[j]] ←C[A[j]] + 1// C[k] = |{key = k}| Loop 3: Θ(k) for j←2 to k do C[j] ←C[j] + C[j -1]// C[k] = |{key <= k}| Loop 4:Θ(n) for j←n downto1 do B[C[A[j]]] ←A[j] C[A[j]] ←C[A[j]] –1 Tootal: Θ(k + n)
16
Stable Sorting مرتب سازي پايدار
1 2 3 4 5 الگوريتم Counting Sort در صورتي كه دو عضو آرايه كليد مساوي داشته باشند، ترتيب آنها را حفظ مي كند. اين نوع الگوريتم را مرتب سازي پايدار مي نامند A 1 2 3 4 5 B
17
خلاصه نام conting sort بهترين :o(n+k) بدترين :o(n+k) حافظه :o(n+k)
پايدار: بله مقايسه اي :خير روش indexing
18
پياده سازي با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]; }
19
پياده سازي با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;
20
پايان
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.