1 import java.util.Date; 2 import java.util.GregorianCalendar 3 /* 4 *转换时间 5 *Input:25-Oct-2013 14:00:00 6 *Output:秒数 7 *按我的理解,Calendar和Date有如下区别 8 *Calendar是一个日历,会有年月日星期等等一些日历中的概念 9 *Date是一个含有日期表示的时间。具体是指时间点 10 * 11 */ 12 public static int calendarToSecond(String timeStr){ 13 String time[]=timeStr.split(" "); 14 15 String dmy[]=time[0].split("-"); 16 int day=Integer.parseInt(dmy[0]); 17 int month=0; 18 //Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec 19 if(dmy[1].equals("Jan"))month=1; 20 if(dmy[1].equals("Feb")) month=2; 21 if(dmy[1].equals("Mar")) month=3; 22 if(dmy[1].equals("Apr")) month=4; 23 if(dmy[1].equals("May")) month=5; 24 if(dmy[1].equals("Jun")) month=6; 25 if(dmy[1].equals("Jul")) month=7; 26 if(dmy[1].equals("Aug")) month=8; 27 if(dmy[1].equals("Sep")) month=9; 28 if(dmy[1].equals("Oct")) month=10; 29 if(dmy[1].equals("Nov")) month=11; 30 if(dmy[1].equals("Dec")) month=12; 31 int year=Integer.parseInt(dmy[2]); 32 33 String hms[]=time[1].split(":"); 34 int hour=Integer.parseInt(hms[0]); 35 int minute=Integer.parseInt(hms[1]); 36 int second=Integer.parseInt(hms[2]); 37 38 Calendar calendar=new GregorianCalendar(year,month-1,day,hour,minute,second); 39 Date date=calendar.getTime(); 40 String dateStr=String.format("%ts",date); 41 int seconds=Integer.parseInt(dateStr); 42 43 return seoncds; 44 } 45 import java.io.File 46 import java.io.FileWriter 47 /* 48 *存储矩阵 49 *Input:矩阵 50 *Output:矩阵文件 51 */ 52 public static void saveMatrx(int [][]matrix,int num,String filepath){ 53 File file=new File(filepath); 54 try{ 55 Writer out=null; 56 out=new FileWriter(file); 57 StringBuffer buf=new StringBuffer(); 58 for(int i=0;i<num;i++){ 59 for(int j=0;j<num;j++){ 60 buf.append(matrx[i][j]+" "); 61 } 62 buf.append(" "); 63 } 64 out.write(buf); 65 out.close(); 66 }catch(Exception e){ 67 e.printStack(); 68 } 69 } 70 /* 71 *二分查找 72 *Input:要查找的数 73 *Output:在数组中的位置 74 *Note:要求数组是有序的,如正序 75 *时间复杂度:最差O(n),最好O(1),平均O(log2n) 76 *空间复杂度:无 77 */ 78 public static int binarySearch(int data[],int n,int value){ 79 int start=1; 80 int end=n; 81 int middle=0; 82 while(start<=end){ 83 middle=(start+end)/2; 84 if(value>data[middle]){ 85 start=middle+1; 86 }else if(value<data[middle]){ 87 end=middle-1; 88 }else{ 89 return middle; 90 } 91 } 92 return 0;//如果没有找到,则返回0,这一点容易忘记! 93 } 94 /* 95 *插入排序之直接插入排序 96 *Input:乱序数组 97 *Output:正序数组 98 *基本思想:前面第一个元素作为有序区,后面的元素不断插入有序区,直到有序区扩展为整个数组 99 *时间复杂度: 100 最好:每个元素只需和前面的元素比较一次,所以总的比较次数n-1次,总的移动次数2(n-1),复杂度O(n) 101 最差:第i个元素需要和前面的i-1个元素+哨兵进行比较,第i个元素比较i次,从第2个元素一直到第n个元素需要被放入到有序区,每做一次比较就需要移动一次记录,复杂度为O(n^2) 102 平均:第i个元素需要和前面的i-1个元素的一般进行比较,计算类似最差情况,故为O(n^2) 103 *空间复杂度:O(1),哨兵的位置 104 *适用情况:数组已基本有序或者数组元素不多的情况 105 *稳定排序 106 */ 107 public static void directInsertSort(int data[],int n){ 108 for(int i=2;i<=n;i++){ 109 data[0]=data[i];//设置哨兵 110 for(int j=i-1;data[0]<data[j],j--){ 111 if(data[0]<data[j]){ 112 data[j+1]=data[j]; 113 } 114 } 115 data[j+1]=data[0]; 116 } 117 } 118 /* 119 *交换排序之冒泡排序 120 *Input:乱序数组 121 *Output:正序数组 122 *基本思想:数组的后边为有序区,前面为无序区,每冒一次泡, 123 *都是无序区的元素两两比较,若第一个元素大于第二个元素,则两个元素进行交换,直到无序区的最大的元素被放到有序区 124 *时间复杂度: 125 * 最好:正序,不用进行移动,比较次数是n-1次,故为O(n) 126 * 最差:逆序,会进行n-1次遍历,第i次遍历,需要比较n-i次,i是从1到n-1的,移动次数是3倍的比较次数,故为O(n^2) 127 * 平均:时间复杂度与最坏情况同数量级,为O(n^2) 128 *空间复杂度:O(1),用于交换元素 129 *稳定排序 130 */ 131 public static void bubbleSort(int data[],int n){ 132 int exchange=n;//用来标记某一次遍历是否进行了元素的交换,所以,exchange要实时记录交换元素的位置 133 int bound=exchange;//用来标记每一次遍历的范围 134 while(exchange){ 135 bound=exchange; 136 exchange=0; 137 for(int i=1;i<bound;i++){ 138 if(data[i]>data[i+1]){ 139 data[0]=data[i]; 140 data[i]=data[i+1]; 141 data[i+1]=data[0]; 142 exchange=i; 143 } 144 } 145 } 146 } 147 /* 148 *交换排序之快速排序 149 *Input:乱序数组 150 *Output:正序数组 151 *基本思想:每次选定一个轴值,通过比较和移动,为轴值确定最后的位置,使得左边的元素均小于轴值,右边的元素均大于轴值 152 *时间复杂度: 153 最好:轴值总是能把元素平均分成两部分。每次划分,假设需要划分的元素个数为i个,则该次划分需要遍历i次,总共需要log2n次划分,故为O(nlog2n); 154 最差:轴值总是待划分序列中最小的或者最大的,因此,每次划分只得到一个比上次少一个元素的子序列,另一个子序列为空,故为O(n^2); 155 平均:O(nlog2n) 156 *空间复杂度:该算法是递归的,则取决于递归的深度 157 最好:O(log2n) 158 最差:要进行n-1次递归调用,故为O(n) 159 平均:O(log2n) 160 *适用情况:元素个数较多且记录随机排列 161 *不稳定排序 162 *快排的平均性能是迄今为止内排序中最好的。快排应用广泛,典型的是UNIX系统调用库函数例程中的qsort函数 163 */ 164 public static void quickSort(int data[],int start,int end){ 165 if(start<end){ 166 pivot=partition(data,start,end);//一次 划分得到轴值,函数为partition 167 quickSort(data,start,pivot-1);//递归的对左侧子序列进行快排 168 quickSort(data,pivot+1,end);//递归的对右侧子序列进行快排 169 } 170 } 171 //划分时是从右侧开始扫描,也就是先j--,再i++ 172 public static int partition(int data[],int start,int end){//没必要每次都把元素总的个数传递进来 173 int i=start; 174 int j=end; 175 while(i<j){//i=j时划分停止 176 while(i<j&&data[i]<=data[j]){//当两个元素相等时,继续遍历,无需交换 177 j--; 178 } 179 if(i<j){ 180 temp=data[i]; 181 data[i]=data[j]; 182 data[j]=temp; 183 i++; 184 } 185 while(i<j&&data[i]<=data[j]){ 186 i++; 187 } 188 if(i<j){ 189 temp=data[i]; 190 data[i]=data[j]; 191 data[j]=temp; 192 j--; 193 } 194 } 195 return i;//i为轴值的最终位置 196 }