Skip to content

Commit 2558c7f

Browse files
dyhdyh
authored andcommitted
添加计数排序
1 parent 8b89b40 commit 2558c7f

File tree

5 files changed

+324
-0
lines changed

5 files changed

+324
-0
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package sort;
2+
3+
import java.util.Arrays;
4+
5+
/**
6+
* @author dengyh
7+
* @version 1.0
8+
* @date 2024/11/30 17:38
9+
* @description 计数排序
10+
*/
11+
public class CountSort {
12+
public static void countingSort(int[] arr) {
13+
if (arr == null || arr.length < 2) return;
14+
int max = arr[0];
15+
int min = arr[0];
16+
for (int num : arr) {
17+
if (num > max) max = num;
18+
if (num < min) min = num;
19+
}
20+
int rangeNum = max - min + 1;
21+
int count[] = new int[rangeNum];
22+
for(int ele : arr){
23+
count[ele - min] ++;
24+
25+
}
26+
System.out.println(Arrays.toString(count));
27+
int preCount = 0;//计数
28+
for (int i = 0 ; i < rangeNum; i ++){
29+
preCount += count[i];
30+
count[i] = preCount - count[i];
31+
// System.out.println(count[i]);
32+
}
33+
System.out.println(Arrays.toString(count));
34+
35+
int res[] = new int[arr.length];
36+
for(int ele : arr){
37+
res[count[ele - min]] = ele;
38+
count[ele - min]--;
39+
}
40+
int i = 0;
41+
for (int ele : res) {
42+
arr[i++] = ele;
43+
}
44+
}
45+
46+
public static void main(String[] args) {
47+
int[] arr = new int[]{6, 6, 12, 31, 54, 4};
48+
countingSort(arr);
49+
System.out.println(Arrays.toString(arr));
50+
}
51+
}
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
package sort;
2+
3+
import java.util.ArrayDeque;
4+
import java.util.Arrays;
5+
6+
/**
7+
* @author dengyh
8+
* @version 1.0
9+
* @date 2024/11/30 15:38
10+
* @description
11+
*/
12+
public class MergeSort {
13+
public static int[] merge(int[] arr1, int[] arr2){
14+
int[] res = new int[arr1.length + arr2.length];
15+
int i = 0, j = 0;
16+
while(i < arr1.length && j < arr2.length){
17+
if(arr1[i] < arr2[j]){
18+
res[i+j] = arr1[i];
19+
i ++;
20+
}else {
21+
res[i+j] = arr2[j];
22+
j++;
23+
}
24+
}
25+
while(i < arr1.length){
26+
res[i+j] = arr1[i];
27+
i++;
28+
}
29+
while(j < arr2.length){
30+
res[i+j] = arr2[j];
31+
j++;
32+
}
33+
return res;
34+
}
35+
36+
public static void mergeSort(int[] arr) {
37+
if (arr.length == 0) return;
38+
int[] result = mergeSort(arr, 0, arr.length - 1);
39+
// 将结果拷贝到 arr 数组中
40+
for (int i = 0; i < result.length; i++) {
41+
arr[i] = result[i];
42+
}
43+
}
44+
45+
// 对 arr 的 [start, end] 区间归并排序
46+
private static int[] mergeSort(int[] arr, int start, int end) {
47+
// 只剩下一个数字,停止拆分,返回单个数字组成的数组
48+
if (start == end) return new int[]{arr[start]};
49+
int middle = (start + end) / 2;
50+
// 拆分左边区域
51+
int[] left = mergeSort(arr, start, middle);
52+
// 拆分右边区域
53+
int[] right = mergeSort(arr, middle + 1, end);
54+
// 合并左右区域
55+
return merge(left, right);
56+
}
57+
58+
private static void merge(int[] arr, int start, int end, int[] result) {
59+
int middle = (start + end) / 2;
60+
// 数组 1 的首尾位置
61+
int start1 = start;
62+
int end1 = middle;
63+
// 数组 2 的首尾位置
64+
int start2 = middle + 1;
65+
int end2 = end;
66+
// 用来遍历数组的指针
67+
int index1 = start1;
68+
int index2 = start2;
69+
// 结果数组的指针
70+
int resultIndex = start1;
71+
while (index1 <= end1 && index2 <= end2) {
72+
if (arr[index1] <= arr[index2]) {
73+
result[resultIndex++] = arr[index1++];
74+
} else {
75+
result[resultIndex++] = arr[index2++];
76+
}
77+
}
78+
// 将剩余数字补到结果数组之后
79+
while (index1 <= end1) {
80+
result[resultIndex++] = arr[index1++];
81+
}
82+
while (index2 <= end2) {
83+
result[resultIndex++] = arr[index2++];
84+
}
85+
// 将 result 操作区间的数字拷贝到 arr 数组中,以便下次比较
86+
for (int i = start; i <= end; i++) {
87+
arr[i] = result[i];
88+
}
89+
}
90+
91+
public static void main(String[] args) {
92+
int[] arr = new int[]{6, 2, 1, 3, 5, 4};
93+
mergeSort2(arr);
94+
System.out.println(Arrays.toString(arr));
95+
}
96+
97+
//原地归并
98+
public static void mergeSort2(int[] arr) {
99+
if (arr.length == 0) return;
100+
mergeSort2(arr, 0, arr.length - 1);
101+
}
102+
103+
private static void mergeSort2(int[] arr, int start, int end) {
104+
// 只剩下一个数字,停止拆分
105+
if (start == end) return;
106+
int middle = (start + end) / 2;
107+
// 拆分左边区域
108+
mergeSort2(arr, start, middle);
109+
// 拆分右边区域
110+
mergeSort2(arr, middle + 1, end);
111+
// 合并左右区域
112+
merge2(arr, start, end);
113+
}
114+
115+
public static void merge2(int[] arr, int start, int end) {
116+
int end1 = (start + end)/2;
117+
int start2 = end1 + 1;
118+
int idx1 = start;
119+
int idx2 = start2;
120+
while(idx1 <= end1 && idx2 <= end){
121+
if(arr[idx1] < arr[idx2]){
122+
idx1 ++;
123+
}else {
124+
int val = arr[idx2];
125+
int index = idx2;
126+
while (index > idx1){
127+
arr[index] = arr[index - 1];
128+
index --;
129+
}
130+
arr[index] = val;
131+
idx1 ++;
132+
idx2 ++;
133+
end1 ++;
134+
}
135+
}
136+
}
137+
138+
139+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package sort;
2+
3+
import java.util.Arrays;
4+
5+
/**
6+
* @author dengyh
7+
* @version 1.0
8+
* @date 2024/12/1 13:43
9+
* @description 相对排序
10+
*/
11+
public class RelativeSortArray {
12+
public static int[] relativeSortArray(int[] arr1, int[] arr2){
13+
if (arr1 == null || arr1.length < 2) return arr1;
14+
int min = arr1[0], max = arr1[0];
15+
for(int num : arr1){
16+
max = Math.max(max, num);
17+
min = Math.min(min, num);
18+
}
19+
int range = max - min + 1;
20+
int[] count = new int[range];
21+
for(int num:arr1){
22+
count[num-min]++;
23+
}
24+
System.out.println(Arrays.toString(count));
25+
int index = 0;
26+
int[] res = new int[arr1.length];
27+
for(int num : arr2){
28+
while (count[num-min] != 0){
29+
res[index++] = num;
30+
count[num-min] --;
31+
}
32+
}
33+
System.out.println(Arrays.toString(arr2));
34+
System.out.println(Arrays.toString(count));
35+
System.out.println(index);
36+
for (int i = 0; i < count.length; i++){
37+
while (count[i] != 0){
38+
res[index++] = i + index;
39+
count[i] --;
40+
}
41+
}
42+
for (int i = 0; i < res.length; i++){
43+
arr1[i] = res[i];
44+
}
45+
return arr1;
46+
}
47+
48+
public static void main(String[] args) {
49+
int[] arr1 = new int[]{2,3,1,3,2,4,6,7,9,2,19};
50+
int[] arr2 = new int[]{2,1,4,3,9,6};
51+
int[] res = relativeSortArray(arr1, arr2);
52+
System.out.println(Arrays.toString(res));
53+
}
54+
}

python/sort/count_sort.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#计数排序
2+
3+
def count_sort(nums):
4+
if not nums:
5+
return []
6+
7+
# 找到数组中的最大值和最小值,确定计数范围
8+
max_value = max(nums)
9+
min_value = min(nums)
10+
range_of_values = max_value - min_value + 1
11+
12+
# 创建计数数组,初始化为0
13+
count_array = [0] * range_of_values
14+
15+
# 统计每个元素出现的次数
16+
for num in nums:
17+
count_array[num - min_value] += 1
18+
19+
# 计算计数数组的前缀和,确定每个元素在排序后数组中的位置
20+
for i in range(1, range_of_values):
21+
count_array[i] += count_array[i - 1]
22+
23+
# 创建排序后的数组
24+
sorted_array = [0] * len(nums)
25+
26+
# 将元素放入排序后数组的正确位置
27+
for num in reversed(nums):
28+
sorted_array[count_array[num - min_value] - 1] = num
29+
count_array[num - min_value] -= 1
30+
31+
return sorted_array
32+
if __name__ == '__main__':
33+
nums = [5,1,1,2,0,0]
34+
res = count_sort(nums)
35+
print(res)

python/sort/merge_sort.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
from typing import List
2+
3+
4+
class Solution:
5+
def mergeSort(self,A: List[int], start: int, end: int):
6+
if start == end:
7+
return
8+
mid = (start + end) // 2
9+
self.mergeSort(A, start, mid)
10+
self.mergeSort(A, mid + 1, end)
11+
self.mergeSort2(A, start, end)
12+
13+
def mergeSort2(self,A: List[int], start: int, end: int):
14+
end1 = (start + end) // 2
15+
start2 = end1 + 1
16+
idx1 = start, idx2 = start2
17+
while idx1 <= end1 and idx2 <= end:
18+
if A[idx1] < A[idx2]:
19+
idx1 += 1
20+
else:
21+
val = A[idx2]
22+
index = idx2
23+
while index > idx1:
24+
A[index + 1] = A[index]
25+
index -= 1
26+
A[index] = val
27+
idx1 += 1
28+
idx2 += 1
29+
end1 += 1
30+
31+
def merge(self, A: List[int], m: int, B: List[int], n: int) -> None:
32+
"""
33+
Do not return anything, modify A in-place instead.
34+
"""
35+
len_A = len(A)
36+
if len_A < 2:
37+
return A
38+
j = 0
39+
for i in range(m, len_A):
40+
A[i] = B[j]
41+
j += 1
42+
43+
self.mergeSort(A, 0, len_A - 1)
44+
return A
45+

0 commit comments

Comments
 (0)