1、数组排序(优化)
(1)基本思路:
定义一个循环,作为外层循环,该循环定义的是交换多少轮数,因为当最后一轮时已经是排好序的,所以最后一轮可以省略。在外层循环内部定义一个内层循环,该循环是定义从第一个数字开始比多少个数字,因为外层循环每循环一次,该轮最大的数字都会放在该轮最后的一位。所以每外层循环循环后多少次,内层循环就要循环(数组元素个数-1-外层循环了多少次)。在内存循环会有一个判断语句,如果满足条件则在内层循环通过定义一个变量将当前位存入,再将当前位的下一位存入第一位,再将变量存入当前位的下一位。优化方面就是避免该数组已经是最终结果却要继续循环判断,方法是再外层循环内,内层循环外定义一个布尔值,设定为ture,内次内层循环中如果又满足条件的语句将数字交换位置,就将布尔值设置为false。如果内层循环结束,布尔值为false,则继续外层循环,如若为ture,则跳出外层循环,输出数组。
(2)实现代码:
public class work1 {
public static void main(String[] args) {
int[] array = { 7, 3, 9, 13, 5 };
outter: for (int i = 0; i < array.length - 1; i++) {
boolean isTrue = true;
for (int j = 0; j < array.length - 1 - i; j++) {
if (array[j] > array[j + 1]) {
array[j] ^= array[j + 1];
array[j + 1] ^= array[j];
array[j] ^= array[j + 1];
isTrue = false;
}
}
if (isTrue) {
break outter;
}
}
System.out.println(Arrays.toString(array));
// [3, 5, 7, 9, 13]
}
}
2、无序数组查找
(1)基本思路:
可使用双指针查找或先排序后二分查找方法,双指针查找指再循环内定义两个查找变量,一个在头部,一个在尾部,如若找到目标元素则退出循环输出目标元素位置,大大的减少的查找的时间复杂度。
(2)实现代码:
public class work1 {
public static void main(String[] args) {
int[] array = { 7, 3, 9, 13, 5 };
int target = 13;
int index = -1;
for (int i = 0, k = array.length - 1; i < array.length; i++, k--) {
if (array[i] == target) {
index = i;
break;
}
if (array[k] == target) {
index = k;
break;
}
}
System.out.println(index);
// 3
}
}
3、有序数组查找(二分)
(1)基本思路:
查找的目标数据元素必须是有序的。没有顺序的数据,二分法就失去意义。因为二分查找是通过数字大小进行比较查找的,因为数据元素通常是数值型,可以比较大小。将目标元素和查找范围的中间值做比较(如果目标元素=中间值,查找结束),将目标元素分到较大/或者较小的一组。通过分组,可以将查找范围缩小一半。直到目标元素=新的范围的中间值,查找结束。
(2)实现代码:
public class work1 {
public static void main(String[] args) {
int[] array = { 7, 3, 9, 13, 5 };
int target = 13;
int index = -1;
for (int i = 0, k = array.length - 1; i < array.length; i++, k--) {
if (array[i] == target) {
index = i;
break;
}
if (array[k] == target) {
index = k;
break;
}
}
System.out.println(index);
}
}
4、数组乱序
(1)基本思路:
数组乱序实现的思路是创建一个循环,将变量下标设置成数组最后一位,依次从后向前遍历,每次遍历时生成一个随机数,随机数的范围是在当前下标的前面范围,所以当循环到1时如果继续取随机数会抛出越界异常所以我们的将变量遍历到数组第二个元素即可,然后依次将当前下标的数组和产生随机下标的数组进行交换,最后输出数组。
(2)实现代码:
public class work1 {
public static void main(String[] args) {
int[] array = { 7, 3, 9, 13, 5 };
for (int i = array.length - 1; i > 0; i--) {
int target = (int) (Math.random() * i);
array[i] ^= array[target];
array[target] ^= array[i];
array[i] ^= array[target];
}
System.out.println(Arrays.toString(array));
// [3, 5, 13, 7, 9]
}
}
5、数组旋转
(1)基本思路:
数组旋转的基本思想就是向左旋转就相当于将第一位元素依次交换到最后一位,而向右旋转就相当于将最后一位元素依次交换到第一位。由于转换到最后一位时还要进行交换,为了防止下标越界,所以设定的范围都不是置换到最后一位而是倒数第二位。
(2)实现代码:
public class work1 {
public static void main(String[] args) {
// 向左旋转
int[] array1 = { 7, 3, 9, 13, 5 };
for (int i = 0; i < 2; i++) {
for (int k = 0; k < array1.length - 1; k++) {
array1[k] ^= array1[k + 1];
array1[k + 1] ^= array1[k];
array1[k] ^= array1[k + 1];
}
}
System.out.println(Arrays.toString(array1));
// [9, 13, 5, 7, 3]
// 向右旋转
int[] array2 = { 7, 3, 9, 13, 5 };
for (int i = 0; i < 2; i++) {
for (int k = array2.length - 1; k > 0; k--) {
array2[k] ^= array2[k - 1];
array2[k - 1] ^= array2[k];
array2[k] ^= array2[k - 1];
}
}
System.out.println(Arrays.toString(array2));
// [13, 5, 7, 3, 9]
}
}