--数组的排序和查找--java学习日记2(基础知识)


      数组是一个相同数据类型的元素按照一定顺序排列的集合。数组的特点:1.只能存放基本数据类型元素。2.数组长度固定,不可改变。3.同一个数组中元素类型相同。

数组的声明:数据类型[]  数组名 =  new  数据类型[count];如: int []  a = new int[10];其中,数据类型指明数组中要存放的元素的类型,数组名用来唯一标识数组,它是数组第一个元素的地址,count代表数组长度。

      将数据保存到数组中是为了对数据进行操作,比如将数组元素按一定规则排序,查找某个特定元素的位置等。常见的排序算法有:冒泡排序,选择排序,插入排序等。效率较高的查找方式是折半查找。下面通过数组a进行说明。

       运用到的java基础知识:数组,排序算法,流程语句控制,位运算等。

       一、排序 

1.冒泡排序

       原理:相邻两个元素进行比较,第一圈最值出现了最后位

     代码示例如下:

public void bubbleSort(int[] a)
{
	for(int i = 0;i < n-1;i++)
	{
		boolean flag = true;// 判断是否进行了交换
		// -i;让每一次比较的元素减少,-1;防止角标越界
		for(int j = i+1;j < n-i-1;j++)
		{
			if(a[j] > a[j+1])
			{
				swap(a[j],a[j+1]);// 两个元素交换位置
				// swap(int[] a, int x, int y);
				flag = false;
			}
		}
		if(flag)// 如果本次没有进行交换则退出,减少循环次数
			break;
	}
}

 

2.选择排序

      原理:两两比较,每次选最小的放左边

public void selectSort(int[] a)
{
	for(int i = 0;i < n-1;i++)// 从a[0]开始
	{
		for(int j = i+1;j < n;j++)// 从a[i]的下一个开始
		{
			if(a[i] > a[j])// 选最小的和a[i]互换
				swap(a[i],a[j]);
		}
	}
}


3.插入排序

      原理:认为第一个元素是有序的,后面每插入一个元素都跟原数组中的元素进行比较

public void insertSort(int[]a)
{
	for(int i = 1;i < a.length;i++) 
	{
		for(int j = i;j > 0;j--)
		{
			if(a[j]<a[j-1])
			{
				swap(a[j],a[j-1]);
			}
		}
	}
}


 

以上排序算法中,swap(int x,int y);为一个交换x, y的函数,实现方式很多,下面给出三种实现:

// 第一种,最常用
public void swap(int x, int y)
{
	int temp = x;
	x = y;
	y = temp;
}
 
// 第二种
public void swap(int x, int y)
{
	x = x + y;
	y = x - y;
	x = x - y;
}

// 第三种,效率最高,不容易想到
public void swap(int x, int y)
{
	x = x^y;
	y = x^y;
	x = x^y;
}


二、折半查找

         前提:数组必须有序才能用折半查找。将要查找的数与数组中间的数比较,如果小于要查找的数,则从右半部分查找,否则从左半部分查找。相等时返回下标,若要查找的数不存在返回-1 。

	public static int halfSearch(int[] a, int key)// key为要查找的数
	{
		int min,max,mid;// min,max,mid分别表示最小、最大、中间值的索引
		min = 0;
		max = a.length-1;
		mid = (max + min)/2;
		while(a[mid] != key)
		{
			if(key>a[mid])// 要查找的数大于中间值,从右半部分查找
				min = mid+1;
			else if(key<a[mid])// 要查找的数大于中间值,从左半部分查找
				max = mid - 1;
			if(min > max)// 要查找的数不存在返回-1
				return -1;
			mid = (max + min)/2;
		}
		return mid;
	}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值