计数排序_数组与集合时间比较
Integer []与ArrayList比较
package com.m.demo;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Test1 {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
Random random = new Random();
Test2 test2 = new Test2();
int n = 15000;
Integer [] arr = new Integer [n];
for (int i = 0; i < n; i++) {
//10~20
list.add(random.nextInt(11)+10);
arr[i] = list.get(i);
}
long startTime = System.currentTimeMillis();
test2.countSort(list);
long endTime = System.currentTimeMillis();
System.out.println("ArrayList:"+(endTime-startTime));
startTime = System.currentTimeMillis();
sort(arr);
endTime = System.currentTimeMillis();
System.out.println("数组:"+(endTime-startTime));
/*
List:9
数组:4
*/
}
public static int[] sort(Integer[] is) {
//1.寻找最大值,来寻找新开辟空间的上限
int max = is[0];
for (int i = 1; i < is.length; i++) {
if (is[i] > max) {
max = is[i];
}
}
//2.根据最大值创建空间
int[] count = new int[max + 1];
//3.遍历数组,统计各个元素的个数
for (int i = 0; i < is.length; i++) {
count[is[i]]++;//找到对应的位置,计数+1
}
//4.遍历统计后的数据,输出结果
int index = 0;
int[] sorted = new int[is.length];
for (int i = 0; i < count.length; i++) {
//每个计数要往排序后的数组放若干次
for (int j = 0; j < count[i]; j++) {
sorted[index++] = i;
}
}
return sorted;
}
}
ArrayList:9
数组:4
LinkedList与Integer []比较
LinkedList:267
数组:4
List计数代码
package com.m.demo;
import java.util.List;
public class Test2 {
public void countSort(List<Integer> list){
//1、找最大值
Integer max = 0;
for(Integer i:list) {
if(max<i) {
max = i;
}
}
//2、创建排序数组
int count [] = new int [max+1];
for (int i = 0; i < list.size(); i++) {
int j = list.get(i);
count[j]++;
}
list.clear();
for (int i = 0; i < count.length; i++) {
for (int j = 0; j < count[i]; j++) {
list.add(i);
}
}
}
/**
* 交换list中的a与b
* @param list
* @param a
* @param b
*/
private void swap(List<Integer> list,int a,int b) {
int temp = list.get(a);
list.set(a, list.get(b));
list.set(b, temp);
}
}