計數排序_陣列與集合時間比較
阿新 • • 發佈:2020-11-22
計數排序_陣列與集合時間比較
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); } }