Skip to content

Latest commit

 

History

History
142 lines (118 loc) · 2.64 KB

常用算法.md

File metadata and controls

142 lines (118 loc) · 2.64 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;  //没有找到
}