快速排序:
如图:首先取出下标为0的数,然后依次与下标为1,2…比较,如果arr[0]>arr[x]时,我们就把这两个数互换下,依次类推一轮循环过后,可以arr[0]就选出为整个数组最小的数,第二轮我们重下标为1开始然后与下标为2,3…数相比,类似第一轮那样。
主要java算法:
for(int i=0,len= arr.length;i<len;i++){ for(int y=i+1;y<len;y++){ if(arr[i]>arr[y]){ swap(arr,i,y); } } } public static void swap (int []arr,int i,int y){ int temp = arr[i]; arr[i] = arr[y]; arr[y] = temp; } |
上面的算法优化:
目的:减少数组中两数互换的数量,我们用量变量记住每一轮,最小的数和其下标;
public static void sort2(int []arr){ for(int i=0,len=arr.length;i<len;i++){ int num = arr[i]; int index = i; for(int y=i+1;y<len;y++){ if(num>arr[y]){ num = arr[y]; index = y; } if(num != i) swap (arr,i,index); } } } |
冒泡排序:
步骤图形分解;
如图:从数组最后两位数开始比较,如果最后一个数小于倒数第二个数,我们就互换这个两个数,然后依次类图按照如上图步骤,第一轮下来后数组下标为0的就取到全数组最小的数;依次类推的方式,按照第二轮,第三轮步骤…
关键算法代码:
public static void doBubbleSort(int []arr){ for(int i = 0,len = arr.length;i < len ; i++){ for (int j = len-1; j > i; j--) { if(arr[j]<arr[j-1]){ swap(arr,j,j-1); } } } } |
二分查找:
前提:给我们的数组是有序的
步骤图解:
说明:我们查找46,第一次定义start,end变量分别问0和数组长度,定义变量med=start+end/2;然后我们那46与arr[med]比较,如果46>arr[med]时,我们把start=med+1;如上图,如果大于的话,我们把end = med-1;依次类推:可以算出第三轮后start和med、end三根线重叠在一起;46=arr[med],这时候找到了,返回med
Java代码:
public static int search(int []arr,int num){ int start = 0; int end = arr.length; int med = 0; while(start<end){ med = (start+end)/2; if(num>arr[med]){ start = med+1; }else if(num <arr[med]){ end = med-1; }else{ return med; } } return med; } |