学Java第四十一天-------查找算法和排序算法
一、查找算法
查找某个元素在数组的索引
1、基本查找
package com.search;public class basic_search {public static void main(String[] args) {//先定义一个数组int [] arr={1,25,30,45,18,6};System.out.println(basicSearch(arr,30));}//定义一个基本查找的函数public static int basicSearch(int[] arr, int e){for (int i = 0; i < arr.length; i++) {if(e==arr[i]){return i;}}return -1;}
}
2、二分查找/折半查找
前提:一定是有序的数组,才能用二分查找
package com.search;public class half_search {public static void main(String[] args) {//1、先定义一个数组int []arr={15,20,28,36,89,123,144};System.out.println(HalfSearch(arr,150));}//2、再定义一个方法二分查找public static int HalfSearch(int[] arr, int e){int min=0;int max=arr.length-1;while(true){if(min>max){return -1;}int mid=(max+min)/2;if(arr[mid]>e){max=mid-1;}else if(arr[mid]<e){min=mid+1;}else{return mid;}}}
}
总结:
3、分块查找
代码:
1、先定义一个块的类
package com.search;public class Block {private int max;private int startindex;private int endindex;public Block() {}public Block(int max, int startindex, int endindex) {this.max = max;this.startindex = startindex;this.endindex = endindex;}public int getEndindex() {return endindex;}public void setEndindex(int endindex) {this.endindex = endindex;}public int getStartindex() {return startindex;}public void setStartindex(int startindex) {this.startindex = startindex;}public int getMax() {return max;}public void setMax(int max) {this.max = max;}}
2、再写查找方法
package com.search;public class BlockSearch {public static void main(String[] args) {//1、先定义一个数组int [] arr={21,16,15,24,45,182,136,145,226,308,432};int number=2265;//2、找到元素number在哪一块//分成三个块Block b1=new Block(24,0,3);Block b2=new Block(182,4,7);Block b3=new Block(432,8,10);//把三个块变成一个块数组Block [] Brr={b1,b2,b3};//调用函数blockSearch(Brr, number, arr);}private static void blockSearch(Block[] Brr, int number, int[] arr) {int blockIndex=findBlockIndex(Brr, number);if(blockIndex==-1){System.out.println("没有该元素");return;}int start= Brr[blockIndex].getStartindex();int end= Brr[blockIndex].getEndindex();boolean f=false;for (int i =start; i <=end; i++) {if(number == arr[i]){System.out.println(i);f=true;}}if(!f){System.out.println("没有该元素");}}public static int findBlockIndex(Block []arr,int number) {for (int i = 0; i < arr.length; i++) {if (arr[i].getMax() > number) {return i;}}return -1;}}
注意:
1)在写一个方法时,有循环判断的话,一定要在循环外也写一个return值,不然如果循环判断里面的不达标,就会没有返回值,所以一定要在循环外面写返回值。
2)接收回来的函数值,一定要判断其可能的取值范围,在下面用的时候,要防止数组索引越界。
二、排序算法
1、冒泡排序

代码:
2、选择排序

代码:
package com.sort;public class SelectSearch {public static void main(String[] args) {int []arr={1,5,8,2,10,4};for (int i = 0; i < arr.length-1; i++) {for (int j = i+1 ; j < arr.length; j++) {if(arr[i]>arr[j]){int tmp=arr[i];arr[i]=arr[j];arr[j]=tmp;}}}printARR(arr);}public static void printARR(int []arr){for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+" ");}}
}
3、插入排序和递归算法
代码:
package com.sort;public class InsertSort {public static void main(String[] args) {int[]arr={1,5,9,2,4,6,3};//得到无序的那一组的开始索引int startindex=-1;for (int i = 0; i < arr.length; i++) {if(arr[i]>arr[i+1]){startindex=i+1;break;}}for (int i = startindex; i < arr.length; i++) {int j=i;while((j>0)&&(arr[j]<arr[j-1])){int tmp=arr[j];arr[j]=arr[j-1];arr[j-1]=tmp;j--;}}printARR(arr);}public static void printARR(int []arr){for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+" ");}}
}
4、快速排序
递归算法:递归指的是方法中调用方法本身的现象。
递归一定要有出口,不然栈内存会溢出报错


递归练习题1:

递归练习题2:

先知道递归函数的方法体是什么,重复的部分就是方法体,之后再找出口,写在方法体中。
快速排序代码:

package com.sort;import java.util.Arrays;public class QuickSort {public static void main(String[] args) {int [] arr={9,2,5,7,6,4,3};QuickSort(arr,0,arr.length-1);System.out.println(Arrays.toString(arr));}public static void QuickSort(int []arr,int start,int end){//最后一定不要忘了写出口!!!if(start>end){return;}//要先有基准元素int BaseElem=arr[start];int i=start;int j=end;//必须先右指针while(i!=j){while(true){if(i==j||arr[j]<BaseElem){break;}j--;}//之后才是左指针while (true){if(i==j||arr[i]>BaseElem){break;}i++;}//此时找到了左右指针对应的元素,进行交换int tmp=arr[i];arr[i]=arr[j];arr[j]=tmp;}//当这样一个循环完成之后,i=j=baseElem应该存放的地方//将基准元素放到i=j之处,算是完成一次“归位”int tmpp=arr[start];arr[start]=arr[i];arr[i]=tmpp;QuickSort(arr,start,i-1);QuickSort(arr,i+1,end);}
}
出口关键点分析:
这里面的出口不能写成 if(start==end) return; ----------因为当9在最右边归位时,第二个递归
QuickSort(arr,i+1,end);也要运行,但当运行该函数时,就变成了QuickSort(arr,7,6),这时start!=end,无法出去,而且arr[7]还会数组越界报错,所以出口只写==是不行的,要写>或者>=还有一种情况是第一个元素已经是最小的,第一次就能归位,那么,左递归就变成了
QuickSort(arr,0,-1);这是start>end,可以找到出口,所以一定要想到特殊情况,防止递归的出口写错。
解析:

排序总结




