计数排序用于对象该如何实现
秋水 Lv5

计数排序原本的思路;

代码实现如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package sorting;

public class CountingSort {
//计数排序的简单实现
void countingSortNative(int[] nums){
// 1. 统计数组的最大元素m
int m = 0;
for (int num : nums){
m = Math.max(m, num);
}

// 2 统计各数字的出现次数
// counter[num] 代表num的出现次数
int[] counter = new int[m+1];

for (int num : nums){
counter[num]++;
}
// 3 遍历counter, 将各元素填入原数组 nums
int i = 0;
for (int num=0; num < m+1; num++){
for (int j = 0; j < counter[num]; j++, i++){
for (int k = 0; k < counter[num]; k++,i++){
nums[i] = num;
}
}
}

}



//完整版的,计数排序,可以实现对象,并且是稳定排序
void cotunringSort(int[] nums){
// 1. 统计数组中的最大元素m
int m = 0;
for (int num : nums) m =Math.max(m,num);

//2 统计各个数组的出现次数
//counter[num]代表num出现的次数
int[] counter = new int[m+1];
for (int num : nums) counter[num]++;

//3 求counter的前缀和,将出现次数转换到尾索引
// 即counter[num]-1 是num在res中最后一次出现的索引
for (int i = 0; i < m; i++) {
counter[i+1] += counter[i];
}

//4 倒序遍历nums,将各元素填入结果数组res
// 初始化数组res用于记录结果
int n = nums.length;
int[] res = new int[n];
for (int i = n; i >= 0; i--){
int num = nums[i];
res[counter[num]-1] = num; //将num放置到对应索引处
counter[num]--; // 令前缀和自减-1,得到下次放置num的索引
}
//使用结果数组res覆盖原数组nums
for (int i = 0; i < n; i++) {
nums[i] = res[i];
}
}

}

对于商品属性,如何进行

代码实现如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package sorting;

public class CountingSort {
//计数排序的简单实现
void countingSortNative(int[] nums){
// 1. 统计数组的最大元素m
int m = 0;
for (int num : nums){
m = Math.max(m, num);
}

// 2 统计各数字的出现次数
// counter[num] 代表num的出现次数
int[] counter = new int[m+1];

for (int num : nums){
counter[num]++;
}
// 3 遍历counter, 将各元素填入原数组 nums
int i = 0;
for (int num=0; num < m+1; num++){
for (int j = 0; j < counter[num]; j++, i++){
for (int k = 0; k < counter[num]; k++,i++){
nums[i] = num;
}
}
}

}



//完整版的,计数排序,可以实现对象,并且是稳定排序
void cotunringSort(int[] nums){
// 1. 统计数组中的最大元素m
int m = 0;
for (int num : nums) m =Math.max(m,num);

//2 统计各个数组的出现次数
//counter[num]代表num出现的次数
int[] counter = new int[m+1];
for (int num : nums) counter[num]++;

//3 求counter的前缀和,将出现次数转换到尾索引
// 即counter[num]-1 是num在res中最后一次出现的索引
for (int i = 0; i < m; i++) {
counter[i+1] += counter[i];
}

//4 倒序遍历nums,将各元素填入结果数组res
// 初始化数组res用于记录结果
int n = nums.length;
int[] res = new int[n];
for (int i = n; i >= 0; i--){
int num = nums[i];
res[counter[num]-1] = num; //将num放置到对应索引处
counter[num]--; // 令前缀和自减-1,得到下次放置num的索引
}
//使用结果数组res覆盖原数组nums
for (int i = 0; i < n; i++) {
nums[i] = res[i];
}
}

}

第三种实现办法,java8新特性Stream流

代码如下

1
2
3
4
List<Product> sortedProducts = products.stream()
.sorted(Comparator.comparingInt(Product::getPrice))
.collect(Collectors.toList());

  • Post title:计数排序用于对象该如何实现
  • Post author:秋水
  • Create time:2024-04-17 15:40:41
  • Post link:tai769.github.io2024/04/17/计数排序用于对象该如何实现/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.