Jump to content
Main menu
Main menu
move to sidebar
hide
Navigation
Main page
Recent changes
Random page
Help about MediaWiki
Special pages
Niidae Wiki
Search
Search
Appearance
Create account
Log in
Personal tools
Create account
Log in
Pages for logged out editors
learn more
Contributions
Talk
Editing
Pigeonhole sort
Page
Discussion
English
Read
Edit
View history
Tools
Tools
move to sidebar
hide
Actions
Read
Edit
View history
General
What links here
Related changes
Page information
Appearance
move to sidebar
hide
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
{{Short description|Sorting algorithm}} __NOTOC__ {{refimprove|date=July 2017}} {{Infobox Algorithm |class=[[Sorting algorithm]] |image= |data=[[Array data structure|Array]] |time=<math>O(N+n)</math>, where ''N'' is the range of key values and ''n'' is the input size |space=<math>O(N+n)</math> |optimal=If and only if <math>N=O(n)</math> }} '''Pigeonhole sorting''' is a [[sorting algorithm]] that is suitable for sorting lists of elements where the number ''n'' of elements and the length ''N'' of the range of possible key values are approximately the same.<ref>{{cite web| url = https://xlinux.nist.gov/dads/HTML/pigeonholeSort.html| title = NIST's Dictionary of Algorithms and Data Structures: pigeonhole sort}}</ref> It requires [[big O notation|O]](''n'' + ''N'') time. It is similar to [[counting sort]], but differs in that it "moves items twice: once to the bucket array and again to the final destination [whereas] counting sort builds an auxiliary array then uses the array to compute each item's final destination and move the item there."<ref>{{cite web|last1=Black|first1=Paul E.|title=Dictionary of Algorithms and Data Structures|url=https://xlinux.nist.gov/dads/HTML/pigeonholeSort.html|website=NIST|access-date=6 November 2015}}</ref> The pigeonhole algorithm works as follows: # Given an array of values to be sorted, set up an auxiliary array of initially empty "pigeonholes" (analogous to a [[pigeon-hole messagebox]] in an office or desk), one pigeonhole for each key in the [[Range_(computer_science)|range]] of the keys in the original array. # Going over the original array, put each value into the pigeonhole corresponding to its key, such that each pigeonhole eventually contains a list of all values with that key. # Iterate over the pigeonhole array in increasing order of keys, and for each pigeonhole, put its elements into the original array in increasing order. == Implementation == Below is an implementation of [[Pigeonhole sort]], written in [[Pseudocode]]. This function sorts the array in-place and modifies the supplied array. '''function''' pigeonhole('''array''' arr) '''is''' min ← '''min'''(arr) max ← '''max'''(arr) index ← 0 range ← max - min + 1 '''array''' tmp ← new array of length range '''for''' i = 0 '''to''' '''length('''arr''')''' '''STEP''' 1 tmp[i] = 0 '''for''' i = 0 '''to''' '''length('''arr''')''' '''STEP''' 1 tmp[arr[i] - min] = tmp[arr[i] - min] + 1 '''for''' i = 0 '''to''' range '''STEP''' 1 '''while''' tmp[j] > 0 '''do''' tmp[j] = tmp[j] - 1 arr[i] = j + min index = index + 1 ==Example== Suppose one were sorting these value pairs by their first element: * (5, "hello") * (3, "pie") * (8, "apple") * (5, "king") For each value between 3 and 8 we set up a pigeonhole, then move each element to its pigeonhole: * 3: (3, "pie") * 4: * 5: (5, "hello"), (5, "king") * 6: * 7: * 8: (8, "apple") The pigeonhole array is then iterated over in order, and the elements are moved back to the original list. The difference between pigeonhole sort and counting sort is that in counting sort, the auxiliary array does not contain lists of input elements, only counts: * 3: 1 * 4: 0 * 5: 2 * 6: 0 * 7: 0 * 8: 1 For arrays where ''N'' is much larger than ''n'', [[bucket sort]] is a generalization that is more efficient in space and time. == See also == * [[Pigeonhole principle]] * [[Radix sort]] * [[Bucket queue]], a related priority queue data structure == References == <references /> {{Wikibooks|Algorithm implementation|Sorting/Pigeonhole sort|Pigeonhole sort}} {{sorting}} [[Category:Sorting algorithms]] [[Category:Stable sorts]] [[ru:Сортировка подсчётом#Алгоритм со списком]]
Summary:
Please note that all contributions to Niidae Wiki may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see
Encyclopedia:Copyrights
for details).
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)
Templates used on this page:
Template:Cite web
(
edit
)
Template:Infobox Algorithm
(
edit
)
Template:Refimprove
(
edit
)
Template:Short description
(
edit
)
Template:Sorting
(
edit
)
Template:Wikibooks
(
edit
)
Search
Search
Editing
Pigeonhole sort
Add topic