冒泡排序,插入排序,快速排序java兑现和效率比较
冒泡排序,插入排序,快速排序java实现和效率比较
从测试结果看,冒泡算法明显不是一般的慢,10万数组的时候冒泡要4秒多,所以就百万就没用冒泡继续测试。
插入排序在结果中看来是最优的,为了方便比较,插入排序分别用了数组和list
综合结果:
list插入排序 > 数组插入排序 > 快速排序 > > 冒泡排序
输出结果:
******万级测试******
快速排序耗时:
5
list插入排序耗时:
1
数组插入排序耗时:
1
冒泡排序耗时:
372
******百万测试******
快速排序耗时:
118
list插入排序耗时:
1
数组插入排序耗时:
12
import java.util.ArrayList; import java.util.List; import java.util.Random; public class SortPractice { public static void main(String[] args){ System.out.println("******正确性测试******"); Random random = new Random(); SortPractice sp = new SortPractice (); int[] nums = new int[10]; //生成随机整数数组 for(int i = 0;i<nums.length;i++){ nums[i] = random.nextInt(); } //输出未排序的数组 sp.println(nums); //输出排序后的数组 sp.println(sp.sort(nums)); sp.println(sp.insertSort(nums)); sp.println(sp.insertSort(sp.toList(nums))); sp.println(sp.quickSort(sp.toList(nums))); System.out.println("******万级测试******"); //万级排序时间测试 nums = new int[10000]; //生成随机整数数组 for(int i = 0;i<nums.length;i++){ nums[i] = random.nextInt(); } List<Integer> list = sp.toList(nums); long begin = System.currentTimeMillis(); sp.quickSort(list); System.out.println("快速排序耗时:\r\n"+(System.currentTimeMillis()-begin)); list = sp.toList(nums); begin = System.currentTimeMillis(); sp.insertSort(list); System.out.println("list插入排序耗时:\r\n"+(System.currentTimeMillis()-begin)); begin = System.currentTimeMillis(); sp.insertSort(nums); System.out.println("数组插入排序耗时:\r\n"+(System.currentTimeMillis()-begin)); begin = System.currentTimeMillis(); sp.sort(nums); System.out.println("冒泡排序耗时:\r\n"+(System.currentTimeMillis()-begin)); System.out.println("******百万测试******"); //百万级,排序时间测试 nums = new int[1000000]; //生成随机整数数组 for(int i = 0;i<nums.length;i++){ nums[i] = random.nextInt(); } list = sp.toList(nums); begin = System.currentTimeMillis(); sp.quickSort(list); System.out.println("快速排序耗时:\r\n"+(System.currentTimeMillis()-begin)); list = sp.toList(nums); begin = System.currentTimeMillis(); sp.insertSort(list); System.out.println("list插入排序耗时:\r\n"+(System.currentTimeMillis()-begin)); begin = System.currentTimeMillis(); sp.insertSort(nums); System.out.println("数组插入排序耗时:\r\n"+(System.currentTimeMillis()-begin)); } /** * 冒泡排序 * @param nums * @return */ public int[] sort(int[] nums){ int temp = 0; for(int i = 0; i < nums.length-1; i++){ for(int j = i+1 ;j < nums.length; j++){ if(nums[j]>nums[i]){ temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } } } return nums; } /** * 插入排序 * @param nums * @return */ public int[] insertSort(int[] nums){ int temp ; for(int i = 1;i<nums.length;i++){ int j = i-1; temp = nums[i]; while(j>=0&&temp>nums[j]){ temp = nums[j]; nums[j] = nums[i]; nums[i] = temp; j--; } } return nums; } /** * list插入排序 * @param nums * @return */ public List<Integer> insertSort(List<Integer> list){ int temp ; for(int i = 1;i <list.size();i++){ int j = i-1; temp = list.get(i); while(j >= 0 && temp > list.get(j)){ temp = list.get(j); list.set(j,list.get(i)); list.set(i,list.get(j)); j--; } if(i>=1000) break; } return list; } /** * 快速排序法 * @param nums * @return */ public List<Integer> quickSort(List<Integer> list){ Integer mid = list.get(new Random().nextInt(list.size())); mid = list.get(5); List<Integer> small = new ArrayList<Integer>(); List<Integer> big = new ArrayList<Integer>(); for(int i = 0; i < list.size(); i++){ if(list.get(i)<=mid){ small.add(list.get(i)); }else{ big.add(list.get(i)); } } list.clear(); if(list.size()>2){ list.addAll(quickSort(big)); list.addAll(quickSort(small)); }else{ list.addAll(big); list.addAll(small); } return list; } /** * 数组转list * @param nums * @return */ public List<Integer> toList(int[] nums){ List<Integer> list = new ArrayList<Integer>(); for(int i = 0; i < nums.length; i++){ list.add(nums[i]); } return list; } /** * 打印数组 * @param nums */ public void println(int[] nums){ System.out.println("-----"); for(int i = 0;i<nums.length;i++){ System.out.println(nums[i]); } } /** * 打印list * @param list */ private void println(List<Integer> list) { System.out.println("---------"); for(Integer obj:list){ System.out.println(obj); } } }