算法准备一
好久没有写博文了,但是每天都关注着博文,今天想想是8月1日,来重新启动自己的博文,过完这个暑假就要开始找工作了,因此从算法开始吧:
今天讨论的是JAVA系统内部的排序和冒泡排序,以及快速排序,因为冒泡排序和快速排序都是属于交换排序的所以一起研究一下:
1.首先看的是系统内部提供的排序:java.util.Arrays.sort()排序:
其里面使用了两种排序方法,快速排序和优化的合并排序。【以下引用他人的话:】
快速排序主要是对哪些基本类型数据(int,short,long等)排序, 而合并排序用于对对象类型进行排序。
使用不同类型的排序算法主要是由于快速排序是不稳定的,而合并排序是稳定的。这里的稳定是指比较相等的数据在排序之后仍然按照排序之前的前后顺序排列。对于基本数据类型,稳定性没有意义,而对于对象类型,稳定性是比较重要的,因为对象相等的判断可能只是判断关键属性,最好保持相等对象的非关键属性的顺序与排序前一直;另外一个原因是由于合并排序相对而言比较次数比快速排序少,移动(对象引用的移动)次数比快速排序多,而对于对象来说,比较一般比移动耗时。
补充一点合并排序的时间复杂度是n*logn, 快速排序的平均时间复杂度也是n*logn,但是合并排序的需要额外的n个引用的空间。
2.冒泡排序:冒泡排序是最简单的一种排序,思路很简单:这里就不啰嗦了。
3.快速排序:是利用的左右left,right来不断分割来实现的,具体见代码如下:
注:因为数据量小,所以基本上耗时看不出来,数据量大的时候是可以看出来的。
1 package cn.mdj.test3; 2 3 import java.util.Arrays; 4 import java.util.Random; 5 6 public class BubbleSort { 7 8 /** 9 * 实例1: 10 * @param args 11 * @throws Exception 12 */ 13 public static void main(String[] args) throws Exception { 14 15 for(int i = 1;i < 5; i++){ 16 int[] arr = new int[10]; 17 int min = 100; 18 int max = 500; 19 //产生100-500内的随机数 20 Random random = new Random(); 21 for(int j=0;j<10;j++){ 22 arr[j] = random.nextInt(max)%(max-min+1) + min; 23 } 24 System.out.println(""); 25 System.out.println("\n第"+i+"次:"); 26 long start = System.currentTimeMillis(); 27 Arrays.sort(arr); 28 long end = System.currentTimeMillis(); 29 System.out.println("内部排序耗时:"+ (end-start)); 30 System.out.println("前十个元素为:"); 31 for(int z=0;z<arr.length;z++){ 32 System.out.print(arr[z]+"、"); 33 } 34 /* 35 start = System.currentTimeMillis(); 36 Bubblesort(arr); 37 end = System.currentTimeMillis(); 38 39 System.out.println(""); 40 System.out.println("冒泡排序耗时:"+ (end-start)); 41 System.out.println("前十个元素为:"); 42 for(int z=0;z<arr.length;z++){ 43 System.out.print(arr[z]+"、"); 44 } 45 */ 46 start = System.currentTimeMillis(); 47 QuickSort(arr,0,arr.length-1); 48 end = System.currentTimeMillis(); 49 System.out.println(""); 50 System.out.println("快速排序耗时:"+ (end-start)); 51 System.out.println("前十个元素为:"); 52 for(int z=0;z<arr.length;z++){ 53 System.out.print(arr[z]+"、"); 54 } 55 } 56 } 57 58 /** 59 * 冒泡排序: 60 * @param arr 61 */ 62 public static void Bubblesort(int[] arr){ 63 int temp; 64 for(int i=0;i<arr.length - 1;i++){ 65 for(int j=arr.length-1;j > i ; j--){ 66 if(arr[j-1] > arr[j]){ 67 temp = arr[j-1]; 68 arr[j-1] = arr[j]; 69 arr[j] = temp; 70 } 71 } 72 } 73 } 74 75 /** 76 * 快速排序: 77 * @param arr 78 * @param start 79 * @param end 80 */ 81 public static void QuickSort(int[] arr,int start,int end){ 82 int left = start; 83 int right = end; 84 int baseNum = arr[start]; 85 while(left<right){ 86 while(left<right && arr[right] >= baseNum){ 87 right--; 88 } 89 if(left<right){ 90 arr[left] = arr[right]; 91 left++; 92 } 93 while(left<right && arr[left] <= baseNum){ 94 left++; 95 } 96 if(left<right){ 97 arr[right] = arr[left]; 98 right--; 99 } 100 } 101 102 arr[left] = baseNum; 103 104 if(start < left){ 105 QuickSort(arr,start,left-1); 106 } 107 if(right < end){ 108 QuickSort(arr,right+1,end); 109 } 110 } 111 }
因为今天很忙,还有其它事情,暂时就先简单写一下吧,具体的算法思想其实任何一本数据结构里面应该都有的。