当前位置:网站首页>Count sort
Count sort
2022-07-05 05:08:00 【ximen502_】
The content and code of this article are from 《 Comics algorithm 》
Bubble sort practiced before 、 Cocktail ordering 、 Quick sort 、 Heap sorting is based on element comparison and position element exchange , There are some special sorts that are not based on element comparisons , Such as Count sorting 、 Bucket sort 、 Radix sorting .
In terms of counting and sorting , This sort algorithm uses array subscripts to determine the correct position of elements .
Let's look at an example :
Suppose there is 20 A random integer , Value range 0-10, Ask for the fastest speed to put this 20 An integer is sorted from small to large
Create a length of 11 Array of , Subscript 0-10, All elements are 0.
hypothesis 20 The numbers are as follows
9,3,5,4,9,1,2,7,8,1,3,6,5,3,4,0,10,9,7,9
Let's go through this 20 A numerical sequence of elements , Each integer is numbered according to its value , At the same time, the elements of the array subscript are added 1 operation .
For example, the first integer is 9, So the subscript is 9 The element of plus 1.
The second integer is 3, So the subscript is 3 The element of plus 1.
Continue to traverse and modify the array …
Finally, when the series is modified , The status of the array is as follows .
The value of each subscript position of the array represents the number of occurrences of the corresponding integer in the sequence . With this statistical result , Sorting is simple . Traversing arrays directly , Output the subscript values of array elements , What is the value of the element , Just output it a few times .
0 1 1 2 3 3 3 4 4 5 5 6 7 7 8 9 9 9 9 10
obviously , Now the output sequence is ordered .
This is the basic process of counting and sorting , It is suitable for integer sorting in a certain range . When the value range is not very large , Its performance is even faster than those with a time complexity of O(nlogn) Sort .
There are many pictures behind , It's not like calligraphy and painting . The most important is the sequential processing involved when there is duplicate data . Or look at the original book , It's a little bit easier to understand . Except for the problem of repeated data order , Another is not to follow the sequence 0 Handling of the initial situation .
The final java The implementation is as follows
int[] countSort(int[] arr) {
// 1. Get the maximum value of the array 、 minimum value , And calculate the travel value d
int max = 0, min = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
if (arr[i] < min) {
min = arr[i];
}
}
int d = max - min;
// 2. Create a statistical array and count the number of corresponding elements
int[] countArr = new int[d + 1];
for (int i = 0; i < arr.length; i++) {
countArr[arr[i] - min]++;
}
// 3. Statistics array deformation , The element after is equal to the sum of the elements before
for (int i = 1; i < countArr.length; i++) {
countArr[i] += countArr[i - 1];
}
// 4. Traverse the original array in reverse order , Find the right position from the statistical array , Output to the result array
int[] sortedArr = new int[arr.length];
for (int i = arr.length - 1; i >= 0; i--) {
sortedArr[countArr[arr[i] - min] - 1] = arr[i];
countArr[arr[i] - min]--;
}
return sortedArr;
}
@Test
public void fun1() {
// int[] arr=new int[]{95,94,91,98,99,90,99,93,91,92};
int[] arr = new int[] {
49, 38, 65, 97, 76, 13, 27, 49 };
int[] sortedArr = countSort(arr);
System.out.println(Arrays.toString(sortedArr));
}
Operate on the operand of the original array n, The calculation amount of the operation statistics sequence is m
Time complexity O(n+m)
Do not consider the result array and statistical array ,
Spatial complexity O(m)
Its time complexity is linear , However, its limitations are also very serious
1. When the difference between the maximum value and the minimum value of a sequence is too large , It's not suitable to sort by count
Give, for example 20 A random integer , The scope is 0 To 1 Billion between , Need to create 1 An array of 100 million elements , Not only a serious waste of space , And the time complexity will also increase .
2. When a sequence element is not an integer , It's not suitable to sort by counting
If all the elements in the sequence are decimals , Such as 25.213, or 0.00 000 001 Numbers like this , The corresponding statistics array cannot be created . This obviously makes it impossible to sort by count .
边栏推荐
- Understand encodefloatrgba and decodefloatrgba
- China polyurethane rigid foam Market Research and investment forecast report (2022 Edition)
- This article is good
- django连接数据库报错,这是什么原因
- Database under unity
- How to choose a panoramic camera that suits you?
- Unity ugui source code graphic
- Pause and resume of cocos2dx Lua scenario
- LeetCode之單詞搜索(回溯法求解)
- AutoCAD - full screen display
猜你喜欢
Use assimp library to read MTL file data
Generate filled text and pictures
Grail layout and double wing layout
Detailed introduction of OSPF header message
AutoCAD - graphic input and output
嵌入式数据库开发编程(五)——DQL
《动手学深度学习》学习笔记
【Leetcode】1352. 最后 K 个数的乘积
Unity check whether the two objects have obstacles by ray
2022 thinking of mathematical modeling C problem of American college students / analysis of 2022 American competition C problem
随机推荐
中国金刚烷行业研究与投资预测报告(2022版)
2022/7/2做题总结
2022/7/1 learning summary
Stm32cubemx (8): RTC and RTC wake-up interrupt
Cocos2dx screen adaptation
cocos2dx_ Lua particle system
3dsmax snaps to frozen objects
Autocad-- dynamic zoom
中国溶聚丁苯橡胶(SSBR)行业研究与预测报告(2022版)
PostgreSQL 超越 MySQL,“世界上最好的编程语言”薪水偏低
AutoCAD - stretching
AutoCAD - graphic input and output
Unity synergy
Basic knowledge points
mysql審計日志歸檔
Ue4/ue5 illusory engine, material chapter, texture, compression and memory compression and memory
Simple HelloWorld color change
《动手学深度学习》学习笔记
中国针状焦行业发展研究与投资价值报告(2022版)
Recherche de mots pour leetcode (solution rétrospective)