Skip to content

Latest commit

 

History

History
133 lines (106 loc) · 2.74 KB

常用算法.md

File metadata and controls

133 lines (106 loc) · 2.74 KB

##常用算法 ###排序

冒泡排序

冒泡:比较两个相邻的数:左边小,右边大

  • 算法实现

      冒泡排序:比较相邻的两个数,小的在左边,大的在右边
      public static void bubbleSort(int[] a){
      	for(int i = 0;i<a.length-1;i++){  //比较的趟数
      		for(int j = 0 ; j <a.length-1-i;j++){ //每一趟比较的次数
      			if(a[j]>a[j+1]){
      				int t = a[j];
      				a[j] = a[j+1];
      				a[j+1]= t;
      			}
      		}	
      	}
      }
    

选择排序

选择:每趟基准值,用于存储最小

  • 算法实现

      public static void selectSort1(int[] a){
      	for(int i=0;i<a.length-1;i++){
      		for(int j=i+1;j<a.length;j++){
      			if(a[i]>a[j]){
      				int t = a[i];
      				a[i] = a[j];
      				a[j] = t;
      			}
      		}
      	}
    

选择排序---增强版 效率高(建议使用)

public static void selectSort(int[] a){
	for(int i=0;i<a.length-1;i++){
		int minIndex = i ; //最小值的下标
		for(int j = i+1 ;j<a.length;j++){
			if(a[minIndex]>a[j]){
				minIndex = j;
			}
		}
		//循环结束
		if(minIndex!=i){
			int t = a[i];
			a[i] = a[minIndex];
			a[minIndex] = t;
		}
	}
}

插入排序

插入:从第二个数值开始,向前边的数列插入保持原有的顺序

  • 算法实现

      //插入排序:默认左边的数是有序的
      public static void insertSort(int[] a){
      	for(int i = 1 ; i<a.length ; i++){
      		for(int j=i;j>0;j--){
      			if(a[j]<a[j-1]){//保证左边的为最小的数
      				int t = a[j];
      				a[j] = a[j-1];
      				a[j-1] = t;
      			}else{
      				break;//如果当前值比左边的值大,则不需要比较
      			}
      		}
      	}
      }
    

###查找

顺序查找

顺序:挨个比较

  • 算法实现

顺序查找:如果找到了,返回对应的下标,如果没有找到返回-1

/*
顺序查找:如果出现了数组中元素重复的情况,不保证找到的是哪一个
 */
static int find(int[] a,int key){
	for(int i=0;i<a.length;i++){
		if(a[i]==key){ //找到了,返回下标
			return i;
		}
	}
	return -1;
}

二分法查找

二分:前提:有序 折半查找

  • 算法实现

      /*
      二分法查找:前提:必须数组有序
      确定中间位置:
      */
      static  int binaryFind(int[] a,int key){
      	int low = 0 ;
      	int high = a.length - 1;
      	int mid = 0;
      	while(low<=high){
      		mid = (low+high)/2;//也可以这样写:mid = (low+high)>>1;
      		if(a[mid]>key){ //左边区域查找
      			high = mid - 1;
      		}
      		else if(a[mid]<key){ //右边区域查找
      			low = mid + 1;			
      		}
      		else{
      			return mid; //找到了
      		}
      	}
      	return  -1;  //没有找到
      }