操作數組的常用方式二-----排序、查找
/**
* 操作數組的常用方式
*/
public class ArrayDemo {
public static void main(String[] args) {
int[] arr = new int[] { 1, 3, 10, 2, 5, 7, 8 };
// 排序前
System.out.println("--------------------排序前--------------------");
printArray(arr);
// 選擇排序
// selectSort(arr);
// 冒泡排序
bubbleSort(arr);
System.out.println("--------------------排序後--------------------");
printArray(arr);
// 普通查找法
System.out.println(arrayIndexOf(arr, 10));
//二分法查找方式1
System.out.println(searchElIndex(arr, 5));
//二分法查找方式2
System.out.println(searchElIndex2(arr, 5));
}
/**
* 選擇排序(每一輪將第一個元素和數組中的每個元素進行比較)
* @param arr 待排序的數組
*/
public static void selectSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
/*
* 調換元素的位置 方式1:使用臨時變量
*/
/*int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;*/
/*
* 方式2,將相比的兩數做加減運算。
* 如:int[] arr = {2,1};
* arr[0] = arr[0] + arr[1]; ==》3=2+1;
* arr[1] = arr[0] - arr[1]; ==》2=3-1;
* arr[0] = arr[0] - arr[j]; ==》1=3-2;
*/
/*arr[i] = arr[i] + arr[j];
arr[j] = arr[i] - arr[j];
arr[i] = arr[i] - arr[j];*/
swap(arr, i, j);
}
}
}
}
/**
* 冒泡排序(兩個相鄰的數進行比較)
* @param arr 待排序的數組
*/
public static void bubbleSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) { // 控製比較的次數
for (int j = 0; j < arr.length - i - 1; j++) { // -i:比較的元素減少 -1:為了避免拋ArrayIndexOutOfBoundsException
if (arr[j] > arr[j + 1]) {
/*int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;*/
swap(arr, j, j+1);
}
}
}
}
/**
* 將數組中的兩個元素交換位置
* @param arr 待交換元素位置的數組
* @param index1 元素下標1
* @param index2 元素下標2
*/
public static void swap(int[] arr, int index1, int index2) {
int temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
/**
* 二分法查找一個元素在數組中的下標
* @param arr 數組
* @param key 要查找的元素
* @return 找到返回元素在數組中的下標,沒找到則返回-1
*/
public static int searchElIndex(int[] arr, int key) {
int min,max,mid;
min = 0;
max = arr.length - 1;
mid = (min + max) / 2;
while (arr[mid] != key) {
if (key > arr[mid]) {
min = mid + 1;
} else if (key < arr[mid]) {
max = mid - 1;
}
if (min > max)
return -1;
mid = (min + max) / 2;
}
return mid;
}
/**
* 二分法查找一個元素在數組中的下標
* @param arr 數組
* @param key 要查找的元素
* @return 找到返回元素在數組中的下標,沒找到則返回-1
*/
public static int searchElIndex2(int[] arr, int key) {
int min,max,mid;
min = 0;
max = arr.length - 1;
while (min <= max) {
mid = (min + max) >> 1;
if (key > arr[mid]) {
min = mid + 1;
} else if (key < arr[mid]) {
max = mid - 1;
} else {
return mid;
}
}
return -1;
}
/**
* 查找一個元素在數組中的位置,該函數可以查找未經排序數組的第一個元素所在數組中的下標
* @param arr 查找的數組
* @param key 查找的元素
* @return 如果找到則返回該元素在數組中的下標,沒找到則返回-1
*/
public static int arrayIndexOf(int[] arr, int key) {
for(int i = 0; i < arr.length; i++) {
if (arr[i] == key)
return i;
}
return -1;
}
/**
* 打印數組
* @param arr 待打印的數組
*/
public static void printArray(int[] arr) {
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
if (i < arr.length - 1) {
System.out.print(arr[i] + ",");
} else {
System.out.print(arr[i]);
}
}
System.out.println("]");
}
}
最後更新:2017-04-02 06:52:18
上一篇:
JAVA猜數遊戲程序小研究
下一篇:
十進製轉換成二進製、八進製、十六進製的通用方法
Android中內存泄露代碼優化及檢測
開博首記
基於MYSQL、R語言、SHINY的中型企業電子商務中心業務分析周報係統
怎樣用SQL語句查詢一個數據庫中的所有表?
JUNIT的java.lang.security安全問題以及classLoader的處理方法
Ecshop如何去掉頁麵標題及版權信息
撿到iPhone7怎麼解鎖?教你如何破解手機鎖屏密碼
Linux中通過mount或smbmount直接掛接Windws中文共享目錄
跨國黑客搶劫巨案揭菲律賓賭場黑金
PostgreSQL 數據庫NULL值的默認排序行為與查詢、索引定義規範 - nulls first\last, asc\desc