Java之陣列排序及二分法查詢
阿新 • • 發佈:2018-12-10
首先先介紹兩種最基本的陣列排序方法:冒泡法和選擇法。 冒泡法排序:依次比較相鄰的兩個元素,如果第一個比第二個大,則交換他們兩個,如此一輪比較下來會產生一個最大的數位於陣列末尾,第二次比較則進行到陣列長度-1個元素,以此類推。
/**
* 冒泡法排序(從小到大)
* @param a 需要排序的陣列
* @return 排序完成後的陣列
*/
public static int[] sort1(int[] a) {
for(int i = 0;i < a.length-1;i++) {
for (int j = 0;j < a.length-1-i;j++) {
if(a[j]>a[j+1]) {
int temp;
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
return a;
}
選擇法排序:先用第一個元素依次和剩下的元素進行比較,如果此元素大於另一個元素,則交換他們,依次類推,直至比較到最後一個元素。
/**
* 選擇法排序
* @param a
* @return
*/
public static int[] sort2(int[] a) {
for(int i = 0;i < a.length;i++) {
for(int j = i+1;j < a.length;j++) {
if(a[i]>a[j]) {
int temp;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
return a;
}
二分法查詢: 使用二分法查詢的陣列必須是已經進行排序好的陣列,首先定義一個初始下標,一個結尾下標,然後用需要查詢的數同陣列中的中間元素進行對比,如果相等,則返回中間陣列元素下標,如果大於此元素,則讓初始下標等於中間下標加一,再次進行對比,直到返回一箇中間下標或者未找到,反之亦然。(中間下標 = (初始下標 + 結尾下標) / 2)
/**
* 二分法查詢
* @param a 需要進行檢索的陣列
* @param idx 需要檢索的值
* @return 檢索結果(該值下標或-1:未找到)
*/
public static int index(int[] a,int idx) {
int min = 0;
int max = a.length-1;
while(min <= max) {
int middle = (min + max)/2;
if(a[middle] == idx) {
return middle;
}
if(idx > a[middle]) {
min = middle+1;
}
else {
max = middle - 1;
}
}
return -1;
}
下面對以上方法進行測試
public static void main(String[] args) {
int[] a = {3,10,15,11,6,7};
for(int x:sort1(a)) {
System.out.print(x + "\t");
}
System.out.println();
int[] b = {5,1,3,7,2,44,12,3};
for(int y:sort2(b)) {
System.out.print(y + "\t");
}
System.out.println();
int[] c = sort2(b);
System.out.println(index(c,22));
}
/**
* output:
* 3 6 7 10 11 15
* 1 2 3 5 7 12 44
* -1
*/