1.排列算法
冒泡排序
- N个数字冒泡排序
- 一共比较N-1轮
- 每轮比较N-1-i次
- 每次相邻元素进行比较
- 满足条件进行交换
package javalianxi;
import java.util.Arrays;
public class Test6 {
public static void main(String[] args) {
int[] array = {1,2,3,4,5,6,7,8,9};
//冒泡排序
//外层循环控制轮数
for(int i = 0,n = array.length ;i< n-1;i++) {
boolean isok = true;
//内层循环控制次数
for(int j = 0 ;j<n-1-i;j++) {
//判断交换
if(array[j] > array[j+1]) {
array[j] = array[j] ^ array[j+1];
array[j+1] = array[j] ^ array[j+1];
array[j] = array[j] ^ array[j+1];
isok = false;
}
}
System.out.println(Arrays.toString(array));
if(isok) {
break;
}
}
System.out.println(Arrays.toString(array));
}
}
2.乱序算法
Fisher-Yates乱序算法
package javalianxi;
import java.util.Arrays;
public class Test7 {
public static void main(String[] args) {
int[] array = {1,2,3,4,5,6,7,8,9};
//逆序交换
for(int i = array.length-1;i>0;i--) {
//产生当前位置以前的随机下标
int index = (int)(Math.random()* i);
array[i] = array[index] ^ array[i];
array[index] = array[index] ^ array[i];
array[i] = array[index] ^ array[i];
}
System.out.println(Arrays.toString(array));
}
}
3.查找算法
- 无序数组:线性查找
int[] num = {5,6,3,7,2,1,7}; int target = 1; int index = -1; for(int i = 0;i<num.length;i++){ if(num[i] == target){ index = i; break; } }
- 有序数组:二分查找
package javalianxi; public class Test8 { public static void main(String[] args) { int[] array = {1,2,3,4,5,6,7,8,9}; //二分查找 int target = 3; // 目标元素 int index = -1; //目标元素的下标 int low = 0,hight = array.length-1; while(low<=hight) { int mid = (low+hight) % 2; if(array[mid] == target) { index = mid; }else if(array[mid]>target){ low = mid +1; }else if(array[mid]<target) { hight = mid-1; } } System.out.println(index); } }
4.旋转数组
- 向右旋转:数组逆序遍历,将尾部元素,不断交换至头部
- 向左旋转:数组顺序遍历,将头部元素,不断交换至尾部
package javalianxi;
import java.util.Arrays;
public class Test9 {
public static void main(String[] args) {
//右旋
int[] arrays1 = {1,2,3,4,5,6,7,8,9};
for(int k = 0;k<3;k++) {
for(int i = arrays1.length-1;i>0;i--) {
arrays1[i] = arrays1[i] ^ arrays1[i-1];
arrays1[i-1] = arrays1[i] ^ arrays1[i-1];
arrays1[i] = arrays1[i] ^ arrays1[i-1];
}
}
System.out.println("右旋三位"+Arrays.toString(arrays1));
//左旋
int[] arrays2 = {1,2,3,4,5,6,7,8,9};
for(int i = 0;i<arrays2.length-1;i++) {
arrays2[i] = arrays2[i] ^ arrays2[i+1];
arrays2[i+1] = arrays2[i] ^ arrays2[i+1];
arrays2[i] = arrays2[i] ^ arrays2[i+1];
}
System.out.println("左旋一位"+Arrays.toString(arrays2));
}
}