Java中数组的操作类Arrays
Arrays类中的方法主要是一些方法的重载,即通过传入参数的不同达到操作不同数组的目的。
经整理,主要是以下六个方法
这里补充一下,sort是升序排序,而且二分排序必须是排好序的数组才能进行操作。
二分查找
package demo1;
import java.awt.RadialGradientPaint;
import java.util.Scanner;
public class demo1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请任意输入一个长度以及一个该长度递增的数组");
int x = sc.nextInt();
int st[] = new int[x];
for (int i = 0; i < x; i++) {
st[i] = sc.nextInt();
}
System.out.println("请输入要查找的数");
int taget = sc.nextInt();
x = binarySearch(st, taget, 0, st.length);
System.out.println(x);
}
public static int binarySearch(int arr[], int taget, int start, int end) {
if (end == start) {
return -1;
}
int middle = (start + end) / 2;
if (arr[middle] == taget) {
return middle;
} else if (arr[middle] < taget) {
return binarySearch(arr, taget, middle, end);
} else {
return binarySearch(arr, taget, 0, middle);
}
}
}
冒泡排序
package demo1;
import java.util.Scanner;
import java.util.Arrays;
public class demo2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入数组长度");
int len = sc.nextInt();
int[] arr = new int[len];
int taget;
for (int i = 0; i < arr.length; i++) {
arr[i] = sc.nextInt();
}
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] < arr[j + 1]) { // 从大到小,从小到大:arr[j]>arr[j+1]
taget = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = taget;
} else
continue;
}
}
for (int i : arr) {
System.out.println(i);
}
}
}
选择排序
package demo1;
import java.util.Scanner;
public class demo3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入数组长度");
int len = sc.nextInt();
int[] arr = new int[len];
for (int i = 0; i < arr.length; i++) {
arr[i] = sc.nextInt();
}
for (int i = 0; i < arr.length - 1; i++) {
int maxIndex = 0;
for (int j = 1; j < arr.length - i; j++) { //因为maxIndex已经定义为0,所以元素从1开始,也跟第一个比较
if (arr[maxIndex] < arr[j]) {
maxIndex = j;
}
}
//最大的数放在末尾,与末尾交换
int taget = arr[maxIndex];
arr[maxIndex] = arr[arr.length - 1 - i];
arr[arr.length - 1 - i] = taget;
}
for (int p : arr) {
System.out.println(p);
}
}
}
插入排序
package demo1;
import java.util.Scanner;
public class demo4 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入需要排序的元素的个数");
int k = sc.nextInt();
int[] arr = new int[k];
for (int i = 0; i < arr.length; i++) {
arr[i] = sc.nextInt();
}
int i;
int j;
for (i = 1; i < arr.length; i++) {
int tmp = arr[i];
for (j = i - 1; j >= 0; j--) {
if (arr[j] > tmp) {
arr[j + 1] = arr[j];
} else {
break;
}
}
arr[j + 1] = tmp;
}
for (int a : arr) {
System.out.println(a);
}
}
}
快速排序
package demo1;
import java.util.Scanner;
public class demo05 {
public static void main(String[] args) {
System.out.println("请输入一个数组长度:");
Scanner sc = new Scanner(System.in);
int len = sc.nextInt();
int arr[] = new int[len];
System.out.println("请输入数组元素");
for (int i = 0; i < len; i++) {
arr[i] = sc.nextInt();
}
Sort(arr, 0, arr.length - 1);
for (int i : arr) {
System.out.println(i);
}
}
public static void Sort(int arr[], int star, int end) {
if (star < end) {
int index = quickSort(arr, star, end);
quickSort(arr, star, index - 1);
quickSort(arr, index + 1, end);
}
}
public static int quickSort(int arr[], int star, int end) {
int target = arr[star];
int i = star;
int j = end;
while (i < j) {
while (i < j && arr[j] >= target) {
j--;
}
if (i < j) {
arr[i] = arr[j];
i++;
}
while (i < j && arr[i] < target) {
i++;
}
if (i < j) {
arr[j] = arr[i];
j--;
}
}
arr[i] = target;
return i;
}
}
当然会有一些代码会把quickSort里面的if的判断丢掉,只写里面的的语句,这里建议加上为好。
当然还有另外一种递归调用方法。
package demo1;
import java.util.Scanner;
public class demo5 {
public static void main(String[] args) {
System.out.println("请输入一个数组长度:");
Scanner sc = new Scanner(System.in);
int len = sc.nextInt();
int arr[] = new int[len];
System.out.println("请输入数组元素");
for (int i = 0; i < len; i++) {
arr[i] = sc.nextInt();
}
quickSort(arr, 0, arr.length - 1);
for (int i : arr) {
System.out.println(i);
}
}
public static void quickSort(int arr[], int star, int end) {
if (star < end) {
int target = arr[star];
int i = star;
int j = end;
while (i < j) {
while (i < j && arr[j] >= target) {
j--;
}
if (i < j) {
arr[i] = arr[j];
i++;
}
while (i < j && arr[i] < target) {
i++;
}
if (i < j) {
arr[j] = arr[i];
j--;
}
}
arr[i] = target;
quickSort(arr, star, i - 1);
quickSort(arr, i + 1, end);
}
}
}
这两种方法都是正确的。
计数排序
不利用大小判断的排序方法–计数排序
package demo1;
import java.util.Scanner;
import java.util.Map;
import java.util.HashMap;
public class demo6 {
public static void main(String[] args) {
System.out.println("请输入一个数组长度:");
Scanner sc = new Scanner(System.in);
int len = sc.nextInt();
int arr[] = new int[len];
System.out.println("请输入数组元素");
for (int i = 0; i < len; i++) {
arr[i] = sc.nextInt();
}
countSort(arr);
for (int i : arr) {
System.out.println(i);
}
}
public static Map<String, Integer> data(int arr[]) {
Map<String, Integer> map = new HashMap<String, Integer>();
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
for (int i = 0; i < arr.length; i++) {
if (max < arr[i]) {
max = arr[i];
}
if (min > arr[i]) {
min = arr[i];
}
}
map.put("max", max);
map.put("min", min);
return map;
}
public static void countSort(int arr[]) {
Map<String, Integer> map = data(arr);
int max = map.get("max");
int min = map.get("min");
int count[] = new int[max - min + 1];
for (int i = 0; i < arr.length; i++) {
count[arr[i] - min]++;
}
int index = 0;
for (int i = 0; i < count.length; i++) {
while (count[i] > 0) {
arr[index++] = i + min;
count[i]--;
}
}
}
}
计数排序的另一种写法,自己参悟一下。
package demo1;
import java.util.Scanner;
import java.util.Map;
import java.util.HashMap;
public class demo06 {
public static void main(String[] args) {
System.out.println("请输入一个数组长度:");
Scanner sc = new Scanner(System.in);
int len = sc.nextInt();
int arr[] = new int[len];
System.out.println("请输入数组元素");
for (int i = 0; i < len; i++) {
arr[i] = sc.nextInt();
}
countSort(arr);
}
public static Map<String, Integer> data(int arr[]) {
Map<String, Integer> map = new HashMap<String, Integer>();
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
for (int i = 0; i < arr.length; i++) {
if (max < arr[i]) {
max = arr[i];
}
if (min > arr[i]) {
min = arr[i];
}
}
map.put("max", max);
map.put("min", min);
return map;
}
public static void countSort(int arr[]) {
Map<String, Integer> map = data(arr);
int max = map.get("max");
int min = map.get("min");
int count[] = new int[max - min + 1];
int result[] = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
count[arr[i] - min]++;
}
for (int i = 1; i < count.length; i++) {
count[i] = count[i] + count[i - 1];
}
for (int i = 0; i < arr.length; i++) {
result[count[arr[i] - min] - 1] = arr[i];
}
for (int i : result) {
System.out.println(i);
}
}
}