Java經常使用算法(四)、時間複雜度、排序、查找java
1、時間複雜度算法
一、 常數階O(1)數組
package test; public class CCC { public static void main(String[] args) { int sum=100; int n=100; sum = sum+n; System.out.println(sum); } }
二、線性階O(n)app
package test; public class CCC { public static void main(String[] args) { int sum=0; int n=100; for(int i=1;i<=n;i++){ sum = sum+i; } System.out.println(sum); } }
三、 對數階O(Log2 n)dom
package test; public class CCC { public static void main(String[] args) { int n=100; for(int i=1;i<=n;i++){ i=i*2; System.out.println(i); } } }
四、 平方階O(n2)ide
例1:ui
int sum=0; int n=100; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ sum = sum+i; } } System.out.println(sum);
例2:spa
int n=100; for(int i=1;i<=n;i++){ for(int j=i;j<=n;j++){ System.out.println(j); } }
當i=1時執行n次,i=2時執行n-1次,......當i=n-1時執行了1次,總共執行的次數爲:3d
blog
所以爲時間複雜度爲:O(n2)
**五、 時間複雜對耗費時間由小到大排序:**

2、經常使用算法
總結了如下幾種經常使用算法:找出最大值、冒泡排序、選擇排序、快速排序、插入排序、希爾排序
二、遍歷數組,找出數組中的最大值
public class Abc{ int[] b=new int[10]; void B(){ for(int i=0;i<b.length;i++){ b[i]=(int)(Math.random()*100); System.out.println("數組的第"+i+"個值爲:"+b[i]); } } int max=b[0]; void A(){ for(int i=0;i<b.length;i++){ int c=b[i]; if(b[i]>=max){ max=b[i]; } } System.out.println("數組的最大值爲:"+max); } }
test1 = [23,32,1,34,33,4,0,3] a = 0 for i in range(len(test1)): if test1[i] > a: a = test1[i] print(a)
三、冒泡排序
import java.util.Arrays; public class Def { public static void DDD(){ int[] d={15,6,3,89,54,34}; System.out.println("原始數組爲:"+Arrays.toString(d)); for(int i=0;i<=d.length;i++){ for(int j=0;j<d.length-1-i;j++){ if(d[j]>d[j+1]){ int t=d[j]; d[j]=d[j+1]; d[j+1]=t; } } } System.out.println("冒泡後數組爲:"+Arrays.toString(d)); } }
d = [23,4,34,5,12,2,34,0,12] for i in range(len(d)): for j in range(len(d)-i-1): if(d[j] > d[j+1]): t = d[j] d[j] = d[j+1] d[j+1] = t print(d) ==> d:[0, 2, 4, 5, 12, 12, 23, 34, 34]
四、選擇排序
package test; public class CCC { public static void main(String[] args) { int[] abc={1,76,54,100,65,34,2,19,40}; System.out.print("快速排序前數組爲:"); for(int num:abc){ System.out.print(num+" "); } for(int i=1;i<abc.length-1;i++){ int k=i; for(int j=i+1;j<abc.length;j++){ if( abc[j]<abc[k]){ k=j; } } if(i !=k){ int tmp=abc[i]; abc[i]=abc[k]; abc[k]=tmp; } } System.out.println(); System.out.print("快速排序前數組爲:"); for(int num:abc){ System.out.print(num+" "); } } }
import sys A = [12,2,34,23,12,45,3,23,10,0,2] for i in range(len(A)): min_index = i for j in range(i+1,len(A)): if(A[min_index] > A[j]): min_index = j A[i],A[min_index] = A[min_index],A[i] print(A) ==》[0, 2, 2, 3, 10, 12, 12, 23, 23, 34, 45]
五、快速排序
package cn.qiuuuu.test; public class sortQuick { public static void sort(int array[],int low,int high){ int i,j; int index; if(low>=high){ return; } i=low; j=high; index=array[i]; while(i<j){ while(i<j&&array[j]>=index){ j--; } if(i<j){ array[i++]=array[j]; } while(i<j&&array[i]<index){ i++; } if(i<j){ array[j--]=array[i]; } array[i]=index; sort(array,low,i-1); sort(array,i+1,high); } } public static void quickSort(int array[]){ sort(array,0,array.length-1); } public static void main(String[] args) { int i=0; int a[]={5,4,9,8,7,6,0,1,3,2}; int len=a.length; quickSort(a); for(i=0;i<len;i++){ System.out.println(a[i]+" "); } } }
六、插入排序
public static int[] insertSort(int[] a){ for (int i = 1; i < a.length; i++) { //待插入元素 int temp = a[i]; int j; for (j = i-1; j>=0; j--) { //將大於temp的日後移動一位 if(a[j]>temp){ a[j+1] = a[j]; }else{ break; } } a[j+1] = temp;//插入進來 } for(int i=0;i<a.length;i++){ System.out.println(a[i]); } return a; }
七、希爾排序
int[] a={49,38,65,97,76,13,27,49,78,34,12,64,1,33,85,29}; int d = a.length/2; //設置增量 while(true){ for(int i=0;i<d;i++){ for(int j=i;j+d<a.length;j+=d){ int temp; if(a[j]>a[j+d]){ temp=a[j]; a[j]=a[j+d]; a[j+d]=temp; } } } if(d==1){break;} d--; }
3、查找算法
一、二分查找/折半查找
public class BinarySearch { public static void main(String[] args){ int[] arr={1,2,3,4,5}; Arrays.sort(arr); binarySearch(arr,4,0,arr.length-1); System.out.println(binarySearch(arr,4,0,arr.length-1)); System.out.println(arr[binarySearch(arr,4,0,arr.length-1)]); } public static int binarySearch(int[] arr,int key,int left,int right){ if(key<arr[left]||key>arr[right]||left>right){ return -1; } int middle=(left+right)/2; if(arr[middle]<key){ return binarySearch(arr,key,middle+1,right); }else if(arr[middle]>key){ return binarySearch(arr,key,left,middle-1); }else{ return middle; } } }
二、