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

JAVA学习网 2021-04-06 19:33:02

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

 

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;
}
}

本文首发于java黑洞网,博客园同步更新

阅读(1100) 评论(0)