數組是一個相同數據類型的元素按照一定順序排列的集合。數組的特點: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;
}