java基础(十四)排序与查找

【选择排序】

概念:挨个比首先得出最小(最大值),接着得到第二最小值(最大值)

例:

从小到大排序
19 ,34,13,109,11,56

过程:


第一轮:


19<34  不用动

19>13  调换位置   13,34,19,109,11,56

13<109 不用动

13>11  调换位置   11,34,19,109,13,56

13<109  不用动 

第一次循环的结果是
11,34,19,109,13,56

第二轮循环:从34开始
原理一样

代码示例:

for(int i=0;i<arr.length-1;i++){
for(int j=1;j<arr.length;i++){
if(arr[i]>arr[j]){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}

选择排序首先得到的是最小值
【冒泡排序】

概念:

下标为x与下标为x+1两两对比,如果arr[x]>a[x+1](arr[x]<a[x+1]),那么就调换位置

11,34,3,190,89,65
从小到大排序

第一轮:
11<34   不用动
34>3    调换位置  11,3,34,190,89,65
34<190  不用动
190>89  调换位置  11,3,34,89,190,65
190>65  调换位置  11,3,34,89,65,190


第二轮对比  还是从11开始比,但是190不用参与比较了


冒泡排序首先得到的是最大值

代码:

for(int x=0;i<arr.length-1;i++){
for(int y=0;arr.length-1;y++){
if(arr[y]>arr[y+1]){
int temp=arr[y];
arr[y]=arr[y+1];
arr[y+1]=temp;
}
}
}
优化
for(int x=0;i<arr.length-1;i++){
for(int y=0;y<arr.length-1-x;y++){
if(arr[y]>arr[y+1]){
int temp=arr[y];
arr[y]=arr[y+1];
arr[y+1]=temp;
}
}
}
-1:为了避免下标越界
-x:减少循环次数
另一种写法
for(int x=arr.length-1;i>0;i--){
for(int y=0;y<x;y++){
if(arr[y]>arr[y+1]){
int temp=arr[y];
arr[y]=arr[y+1];
arr[y+1]=temp;
}
}

}

开发中用的是java封装好的排序类与方法  Arrays.sort(arr)




【查找】


public static int getIndex(int[]arr,int key){
  
   for(int x=0;a<arr.length;x++){
if(arr[x]==key){
return x;
}
return -1;
}
}

【折半查找】

前提:必须是已经排序的数组
原理:找一个数从数组中间开始找,如果大(或小)了,就往左(或右)找,再取中间的值,再比。。

代码示例:
 /**
  *查找的数组,key要找的值
  */
private static int halfSearch(int []arr,int key){
int min,mid,max
min=0;
max=arr.length-1;
mid=(min+max)/2
while(arr[min]!=key){
if(key>arr[mid])min=mid+1;
else if(key<arr[mid])max=mid-1;
         if(max<min)
         return -1;
      mid=(min+max)/2
}
      return mid;
}

另一种写法:

public static int halfSearch_2(int []arr,int key){
int min,mid,max;
min=0;
max=arr.length-1;
mid=(min+max)/2
while(min<=max){
if(key>arr[mid])
           min=mid+1;
else if(key<arr[mid])
  max=mid-1;
else 
return mid;
}
   return -1;
}
java API中封装的折半查找 Arrays.binarySearch(arr,key);

猜你喜欢

转载自blog.csdn.net/qq_35494622/article/details/80374755
今日推荐