冒泡排序与快速排序、二分查找

本文介绍了三种基础但重要的算法:冒泡排序、快速排序和二分查找。冒泡排序是一种简单的排序方法,时间复杂度为O(n^2)。快速排序利用递归和指针操作实现高效排序。二分查找则适用于已排序数组,通过不断缩小搜索范围提高查找效率。这些基础知识对于理解更复杂的算法至关重要。
摘要由CSDN通过智能技术生成

冒泡、快排、二分查找算法

冒泡排序

新手最先接触到的排序算法,对一个数组进行遍历,遍历过程中进行比较,如果该位置的元素大于后一位置的元素,则将两元素交换。

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

此算法时间复杂度为O(n^2);

注意点:外层循环是保证每一个元素都要参与到冒泡中,内层循环是保证每一个元素都要进行冒泡比较。当外层循环每走一次,表示找到了一个最大的值,并且放在数组的 a.length-i-1的位置上.

快速排序

首先介绍快速排序需要用到的工具:左指针、右指针、中间值。

用到的思想:递归

取数组中第一个元素作为中间值,然后左右指针分别跟中间值进行比较,小于中间值的放在左边,大于中间值的放在右边,当左右指针重合时,重合位置处的左边数值全部比中间值小,右边全部比中间值大。

这样数组就分成了两个部分,再对这两部分如法炮制,分别又生成了两个数组,依次递归下去,递归结束的条件是左指针大于或者等于右指针。

public static void quickSort(int[] a,int left,int right) {
		if(left < right) {
			int index = getIndex(a,left,right);
			quickSort(a,left,index-1);
			quickSort(a,index+1,right);
		}						
	}	
public static int getIndex(int[] a,int left,int right) {
		int tmp = a[left];
		while(left < right) {
			//用while循环,来判断右指针对应的数是否大于tmp,是的话不用交换,直接移动右指针即可
			while(left < right && a[right] >= tmp) {
				right--;
			}
			//顺序执行到这里,肯定是不满足上面的while循环条件,也就是右边的数要小于中间值,此时需要把右边的数换到左边
			a[left] = a[right];
			
			while(left < right && a[left] <= tmp) {
				left++;
			}
			a[right] = a[left];
		}
    //当循环结束后,左右两边都分好大小,而指针重合位置处却没有值,需要把中间值放进来。
		a[left] = tmp;
    //返回两者相交处。
		return left;
	}

二分查找

当我们需要在已排好序的数组中寻找到特定值时,可以使用二分查找,效率高。

所需要用到的工具:左指针、右指针、mid指针

思想:左指针右指针分别对应该元素所在数组中的范围边界,初始化值为0和a.length;取中间值=(左指针+右指针+1)/2,这样就得到两个个区间(左指针,mid)(mid,右指针),判断mid处的值与待确定位置值(S)的大小关系,若mid>S,说明S的位置应该在左区间,反之则在右区间。然后取对应的区间,再次如法炮制,递归求解后得到正确结果。

public class BinarySearch {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] a = new int[] {1,2,4,6,7,9,11,15};
		System.out.println(BinarySearch.binarySearch(a, 0, a.length, 10));
		

	}
	static boolean isFind = false;
	public static int binarySearch(int[] a,int left,int right,int search) {
		
		while(!isFind)
		{
			if(left>=right) break;
			int mid = (left+right+1)/2;
			
			if(a[mid] > search) {
				right = mid-1;
			}else if(a[mid] < search) {
				left = mid+1;
			}else if(a[mid] == search) {
				isFind = true;
				left = mid;
			}
		} 
		if(!isFind) left = -1;
		return left;
	}
}
	长恨此身非我有,何时忘却芩芩。夜阑风静縠纹平。小舟从此逝,江海寄余生。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值