黑马程序员--数组(二)常见算法
给定一个数组(5,1,6,4,2,8,9)
- 获取数组中的最大值,以及最小值
获取数组中的最大值
思路:
- 获取最值需要进行比较,每一次比较都会有一个较大的值,因为该值不确定
通过一个变量进行临是存放
- 让数组中的每一个元素都和这个变量中的值进行比较
如果大于了变量中的值,就用该变量记录较大值
- 当所有的元素都比较完成,那么该变量中存储的就是数组中的最大值了
步骤:
1.定义变量,临时存放较大值,该变量初始化为数组中任意一个元素即可
2.通过循环语句对数组进行遍历
3.在变量过程中定义判断条件,如果遍历到的元素比变量中的元素大,就赋值给该变量;
需要定义一个功能来完成,以便提高复用性
- 明确结果,数组中的最大元素 int
- 未知内容:一个数组 int[ ]
获取数组中最大值:
方法1;
代码示例:
class MaxDemo
{
public static void main(String[] args)
{
int []arr={5,1,6,4,2,8,9};
int max=getMax(arr);
System.out.println("最大值是:"+max);
}
public static int getMax(int []arr){
int max=arr[0];
for(int i=1;i<arr.length;i++){
if(arr[i]>max){
max=arr[i];
}
}
return max;
}
}
结果:
方法2:
获取最大值得另一个方式
可以将变量初始化为0,但是是在初始化数组中任意一个角标,不能是元素
代码示例:
class MaxDemo
{
public static void main(String[] args)
{
int []arr={5,1,6,4,2,8,9};
int max=getMax(arr);
System.out.println("最大值是:"+max);
}
public static int getMax(int []arr){
int max=0;
for(int i=1;i<arr.length;i++){
if(arr[i]>arr[max]){
arr[max]=arr[i];
}
}
return arr[max];
}
}
结果:
获取数组中的最小值
代码示例:
class MinDemo
{
public static void main(String[] args)
{
int []arr={5,1,6,4,2,8,9};
int min=getMin(arr);
System.out.println("最小值是:"+min);
}
public static int getMin(int []arr){
int min=arr[0];
for(int i=1;i<arr.length;i++){
if(arr[i]<min){
min=arr[i];
}
}
return min;
}
}
结果:
- 对给定数组进行排序(选择排序)
代码示例;
class ArraySortDemo
{
public static void main(String[] args)
{
int []arr={3,6,2,9,1,5,0};
System.out.println("排序前");
show(arr);
sort(arr);
System.out.println("排序后");
show(arr);
}
//排序方法
public static void sort(int[]arr){
for(int i=0;i<arr.length-1;i++){
for(int j=i+1;j<arr.length;j++){
if(arr[i]>arr[j]){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
}
//打印数组方法
public static void show(int [] arr){
for(int i=0;i<arr.length;i++){
if(i!=arr.length-1){
System.out.print(arr[i]+",");
}else{
System.out.println(arr[i]);
}
}
}
}
结果:
冒泡排序法
冒泡排序:相邻的两个元素进行比较,如果符合条件换位
第一圈:最值出现在了最后位
代码示例:
class ArraySortDemo
{
public static void main(String[] args)
{
int []arr={3,6,2,9,1,5,0};
System.out.println("排序前");
show(arr);
sort(arr);
System.out.println("排序后");
show(arr);
}
//排序方法
public static void sort(int[]arr){
for(int i=0;i<arr.length-1;i++){
for(int j=i+1;j<arr.length;j++){//-x:让每一次比较元素较少,-1:避免角标越界
if(arr[i]>arr[j]){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
}
//打印数组方法
public static void show(int [] arr){
for(int i=0;i<arr.length;i++){
if(i!=arr.length-1){
System.out.print(arr[i]+",");
}else{
System.out.println(arr[i]);
}
}
}
}
结果:
发现无论什么排序,都需要对满足条件的元素进行位置置换
所以可以把这部分相同的代码提取出来,单独封装一个函数
public static void swap(int [ ] arr,int a,int b){
int temp=arr[a];
arr[a]=arr[b];
arr[b]=temp;
}
Arrays.sort(Array[ ] arr );方法是java中已经定义好的一中排序方式,开发中,对数组排序,要使用该句代码
数组的查找操作
折半法:
/*
折半查找:
提高效率,但是必须要保证给数组是有序的数组
*/
class ArraySeactDemo
{
public static void main(String[] args)
{
int [] arr={2,4,5,7,19,32,45};
//int index=halfSearch(arr,5);
int index=halfSearch_2(arr,5);
System.out.println(index);
}
public static int halfSearch(int [] arr,int key){
int min,max,mid;
min=0;//第一个角标
max=arr.length-1;//最后一个角标
mid=(min+max)/2;//折半
//循环条件,当中间值不等于要查找的值,就一直循环查找
while(arr[mid]!=key){
if(key>arr[mid]){
min=mid+1;
}else if(key<arr[mid]){
max=mid-1;
//当没有相同的时候,返回-1
if(min>max){
return -1;
}
}
mid=(min+max)/2;
}
return mid;
}
/*
折半方法2
*/
public static int halfSearch_2(int []arr,int key){
int min=0,max=arr.length,mid;
//当min<=max就折半
while(min<=max){
mid=(min+max)>>1;
if(key>arr[mid]){
min=mid+1;
}else if(key<arr[mid]){
max=mid-1;
}else{
return mid;
}
}
return -1;
}
}
结果:
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
详细请查看:<a
href="http://edu.csdn.net" target="blank">http://edu.csdn.net</a>