计数排序
java代码实现
package csdn.dreamzuora.sort;
import java.util.List;
public abstract class Sort<E> {
public void sort(List<E> array){
};
public void sort(List<E> array, int left, int right){
};
}
package csdn.dreamzuora.sort;
import java.util.ArrayList;
import java.util.List;
public class CountSort extends Sort<Integer> {
@Override
public void sort(List<Integer> array) {
int size = array.size();
Integer max = array.get(0);
Integer min = array.get(0);
for (int i = 1; i < size; i++){
Integer val = array.get(i);
if (max < val){
max = val;
}
if (min > val){
min = val;
}
}
int len = max - min;
int offset = min;
int [] tempList = new int[len + 1];
for (int i = 0; i < size; i++){
Integer val = array.get(i) - offset;
Integer count = tempList[val];
if (count == null){
count = 0;
}
tempList[val] = ++count;
}
int k = 0;
for (int i = 0; i < len; i++){
Integer count = tempList[i];
if (count != null){
while (count != 0){
array.set(k++, i + offset);
count --;
}
}
}
}
}
单元测试
package csdn.dreamzuora.sort;
import org.junit.Test;
import org.junit.jupiter.api.Assertions;
import java.util.Arrays;
import java.util.List;
import static org.junit.Assert.*;
public class CountSortTest {
@Test
public void sort() {
CountSort countSort = new CountSort();
List<Integer> list = Arrays.asList(4, 8, 4, 6, 2, 10);
List<Integer> expectList = Arrays.asList(2, 4, 4, 6, 8, 10);
countSort.sort(list);
Assertions.assertEquals(expectList, list);
}
}
桶排序
java代码实现
package csdn.dreamzuora.sort;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
public class BucketSort extends Sort<Integer>{
@Override
public void sort(List<Integer> array) {
if (array == null || array.isEmpty()){
return;
}
int max = array.get(0);
int min = array.get(0);
int size = array.size();
for (int i = 0; i < size; i++){
max = Math.max(array.get(i), max);
min = Math.min(array.get(i), min);
}
int offset = max - min;
int bucketSize = (max - min) / size + 1;
List<LinkedList<Integer>> bucketList = new ArrayList<>(bucketSize);
for (int i = 0; i < bucketSize; i++){
bucketList.add(new LinkedList<>());
}
for (int i= 0; i < size; i++){
int val = array.get(i);
int num = (array.get(i) - min) * (bucketSize - 1) / offset;
bucketList.get(num).add(val);
}
List<Integer> sortList = new ArrayList<>();
for (int i = 0; i < bucketSize; i++){
Collections.sort(bucketList.get(i));
}
int index = 0;
for (LinkedList<Integer> itemList : bucketList){
for (Integer val : itemList){
sortList.set(index++ , val);
}
}
}
}
单元测试
package csdn.dreamzuora.sort;
import org.junit.Test;
import org.junit.jupiter.api.Assertions;
import java.util.*;
import static org.junit.Assert.*;
public class BucketSortTest {
BubbleSort bubbleSort = new BubbleSort();
@Test
public void sort() {
List<Integer> list = Arrays.asList(4, 8, 4, 6, 2, 10);
List<Integer> expectList = Arrays.asList(2, 4, 4, 6, 8, 10);
bubbleSort.sort(list);
Assertions.assertEquals(expectList, list);
}
@Test
public void sort2() {
Random random = new Random();
List<Integer> actuallyList = Arrays.asList(random.nextInt(100), random.nextInt(100), random.nextInt(100), random.nextInt(100), random.nextInt(100), random.nextInt(100));
List<Integer> expectList = new ArrayList<>(actuallyList);
Collections.sort(expectList);
bubbleSort.sort(actuallyList);
Assertions.assertEquals(expectList, actuallyList);
}
}