数组常用算法:排序,复制,查找,反转。接下来逐一介绍。
1.数组的排序
对于排序大家要做到能手写冒泡排序和快速排序,而对于归并排序和堆排序而言,能说出其实现原理即可。
1.1 冒泡排序:比较简单,原理不再叙述。
package array.guigu.demo;
public class BubbleSortTest {
public static void main(String[] args) {
int[] arr = new int[] {43,32,76,-98,0,64,33,-21,32,99};
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]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
for(int i = 0;i < arr.length;i++) {
System.out.print(arr[i] + "\t");
}
}
}
1.2 快速排序: 分治思想,递归调用
package array.guigu.demo;
/**
* 快速排序
* 通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,
* 则分别对这两部分继续进行排序,直到整个序列有序。
*/
public class MyQuickSort {
private static void swap(int[] data, int i, int j) {
int temp = data[j];
data[j] = data[i];
data[i] = temp;
}
private static void subSort(int[] data, int start, int end) {
if(start < end) {
int base = data[start];
int low = start;
int high = end + 1;
while(true) {
while(low < end && data[++low] - base <= 0)
;
while(high > start && data[--high] - base >= 0)
;
if(low < high) {
swap(data, low, high);
}else {
break;
}
}
swap(data, start, high);
subSort(data, start, high - 1); //递归调用
subSort(data, high + 1, end);
}
}
public static void quickSort(int[] data) {
subSort(data, 0, data.length - 1);
}
public static void main(String[] args) {
int[] data = {9, -16, 30, 23, -30, -49, 25, 21, 30};
System.out.println("排序之前:\n" + java.util.Arrays.toString(data));
quickSort(data);
System.out.println("排序之后:\n" + java.util.Arrays.toString(data));
}
}
2.数组的复制
数组的复制并不是简单的赋值操作,这一点你要区分开。
package array.guigu.demo;
public class ArrayDemo06 {
public static void main(String[] args) {
//数组的复制
int[] array1,array2;
array1 = new int[]{1,2,3,4,5,6,7,8};
array2 = new int[array1.length];
for(int i = 0;i < array1.length;i++) {
array2[i] = array1[i];
}
for(int i = 0;i < array2.length;i++) {
System.out.print(array2[i] + "\t");
}
}
}
3.数组的查找
3.1 顺序查找:
package array.guigu.demo;
public class ArrayDemo07 {
public static void main(String[] args) {
String[] arr = new String[] {"JJ","DD","MM","BB","GG","AA"};
String dest = "BB";
boolean isFlag = true;
//线性查找
for(int i = 0;i < arr.length;i++) {
if(arr[i] == dest) {
isFlag = false;
System.out.println("存在!!");
break;
}
}
if(isFlag) {
System.out.println("很遗憾,没有找到!!");
}
}
}
3.2 二分查找:前提是数组要有序
package array.guigu.demo;
public class ArrayDemo07 {
public static void main(String[] args) {
int[] arr2 = new int[] {-98,-34,2,34,54,66,79,105,210,333};
int dest1 = -34;
int head = 0;
int end = arr2.length - 1;
while(head <= end) {
int middle = (head + end) / 2;
if(arr2[middle] == dest1) {
isFlag = false;
System.out.println("找到了元素,位置是:" + middle);
break;
}else if(arr2[middle] > dest1) {
end = middle - 1;
}else {
head = middle + 1;
}
}
if(isFlag) {
System.out.println("未找到元素。。。");
}
}
}
4.数组的反转
4.1 第一种方法:
String[] arr = new String[] {"JJ","DD","MM","BB","GG","AA"};
for(int i = 0;i < arr.length / 2;i++) {
String temp = arr[i];
arr[i] = arr[arr.length - i - 1];
arr[arr.length - i - 1] = temp;
}
for(int i = 0;i < arr.length;i++) {
System.out.print(arr[i] + "\t");
}
4.2 第二种方法:
String[] arr = new String[] {"JJ","DD","MM","BB","GG","AA"};
for(int i = 0,j = arr.length - 1;i < j;i++,j--) {
String temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
for(int i = 0;i < arr.length;i++) {
System.out.print(arr[i] + "\t");
}