数组是一个相同数据类型的元素按照一定顺序排列的集合。数组的特点: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;
}