黑马程序员_选择排序、冒泡排序与折半查找

------- android培训java培训、期待与您交流! ----------

一、排序
1、选择排序
 
 

//选择排序
class SelectSort
{
public static void main(String[] args)
{
int[] a = {2 ,32, 12, 43, 53, 21};
for (int i=0; i<a.length; i++)//输出数组
{
System.out.print(a[i]+" ");
}
System.out.println();//换行
selectSort(a);//调用选择排序
for (int i=0; i<a.length; i++)//输出数组
{
System.out.print(a[i]+" ");
}

}

public static void selectSort(int[] arr)//选择排序
{
for (int m=0; m<arr.length-1; m++)
{
for (int n=m+1; n<arr.length; n++)
{
if (arr[m]>arr[n])//如果条件满足,就交换两元素数值
{
int swap = arr[m];
arr[m] = arr[n];
arr[n] = swap;
}
}
}
}
}

选择排序,依次将每一位和其它位进行比较:
(1)由第1个for循环进行控制m。
(2)当m=0时,进入到第2 个for循环,第2个for循环控制n。
(3)n依次从1增加到arr.length。就导致arr[0]依次和arr[n]进行比较。
(4)n增到最大,就完成第1轮比较,arr[0]就获得了最小值。
(5)m+1,进行第2轮比较。
注意:
m<arr.length-1,即m最大值arr.length-2。
当m=arr.length-2时,n=m+1,即arr.length-1,因为n<arr.length,n的最大值就是arr.length-1,也是数组的最后一个元素。
以上控制,刚好可以将元素比较完全。

2、冒泡排序
//冒泡排序
class BubbleSort
{
public static void main(String[] args)
{
int[] a = {2 ,32, 12, 43, 53, 21};
for (int i=0; i<a.length; i++)
{
System.out.print(a[i]+" ");
}
System.out.println();
bubbleSort(a);//调用冒泡排序
for (int i=0; i<a.length; i++)
{
System.out.print(a[i]+" ");
}
}

public static void bubbleSort(int[] arr)//冒泡排序
{
for (int m=0; m<arr.length-1; m++)
{
for (int n=0; n<arr.length-m-1; n++)
{
if (arr[n]>arr[n+1])
{
int swap = arr[n];
arr[n] = arr[n+1];
arr[n+1] = swap;
}
}
}
}
}


冒泡排序,每次比较相邻的两个元素:
(1)m=0时,n=0,n最大值arr.length-2。
(2)比较arr[0]与arr[1]。
(3)n+1,取1,比较arr[1]与arr[2]。
(4)依次比较到arr[arr.length-2]与arr[arr.length-1]结束此次循环。
(5)m=1,继续进行下次比较循环。
注意:
每轮比较完成后,数组末尾的元素是最大值。
m<arr.length-1,最大值取arr.length-2。
此时,n=1。
每次循环结束,n的取值范围在-1。因为不需要将arr[0]与自身相比,所以出现以上范围。

二、折半查找
折半查找适合于已经排序的数组。
 
 

//折半查找
class HalfSearch
{
public static void main(String[] args)
{
int[] a = {1, 4, 8, 32, 54, 65, 81, 98};
for (int i=0; i<a.length; i++)
{
System.out.print(a[i]+" ");
}
int key = 8;
System.out.println("\nkey:"+key);
int l = halfSearch(a, key);//调用查找函数,并将返回值赋给l
System.out.println(l);
}
public static int halfSearch(int[] arr, int key)//折半查找
{
int half = arr.length/2;//定义中间变量
int min=0, max=arr.length-1;//初始化开头、结尾
while (arr[half]!=key)//如果满足,循环结束
{
//将中间值与key进行比较
if (arr[half]>key)//大于key,在中间值左边
{
max=half-1;
}
else
min=half+1;//反之,在右边

if (min>max)//如果满足,说明未找到
{
//System.out.println(half);//返回key值应插入位置
return -1;//结束函数,返回-1进行标识
}
half = (min+max)/2;//调整half值,使得循环继续
}
return half;
}
}

折半查找,不断的将key值与中间值进行比较,动态调整min、max的值,使得查找范围逐渐缩小,再调整half值,动态定位中间量的位置。至最终找到。

----------- android培训java培训、期待与您交流! --------------   

详细请查看:http://edu.csdn.net/heima/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值