排序算法
冒泡排序
冒泡排序是一种简单的排序算法,它的工作原理是通过重复遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。这个过程会重复地进行,直到没有再需要交换,也就是该数列已经排好序了
- 比较相邻元素:在数列中,从第一个元素开始,依次比较相邻的两个元素。
- 交换元素:如果第一个元素比第二个元素大,则交换它们的位置。
代码如下
public class test01 {
public static void main(String[] args) {
int[] array = {2,5,6,8,7,9,5,4};
for(int i = 0,n =array.length;i<n-1;i++){
boolean isok = true;
for (int k =0;k<n-1-i;k++){
if(array[k] >array[k+1]) {
// 交換相邻元素
array[k] = array[k] ^ array[k + 1];
array[k + 1] = array[k] ^ array[k + 1];
array[k] = array[k] ^ array[k + 1];
isok = false;
}
}
// 冒泡排序优化 如果数组本来就是有序,则可以节省资源
if (isok){
break;
}
}
}
}
乱序算法
乱序算法就是希望打乱一个基本有序的序列,越乱越好
public class test02 {
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 rodm = (int) (Math.random()*i);
array[rodm] = array[rodm] ^ array[i];
array[i] = array[rodm] ^ array[i];
array[rodm] = array[rodm] ^ array[i];
}
}
}
查找算法
线性查找(数组无序)
public class test03 {
public static void main(String[] args) {
int[] array = {2,5,6,8,7,9,5,4};
int target = 6;
int index = -1;
for (int i = 0;i<array.length;i++){
if(array[i]==target){
index =i;
}
}
}
}
二分查找(有序)
二分查找,也称为折半查找,是一种高效的查找方法。它的基本思想是将目标值与线性表中间的元素进行比较,如果目标值小于中间元素,则在数组的左半部分继续查找,否则在右半部分查找,不断缩小搜索范围,直到找到目标值或确定目标值不存在为止。二分查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。时间复杂度为O(logn)。
public class test03 {
public static void main(String[] args) {
int[] array = {1,2,3,4,5,6,7,8,9};
int min = 0;
int target = 5;
int index = -1;
int max = array.length-1;
while (min <=max) {
int mid = (min + max) >> 1;
if (array[mid] == target){
index = mid;
break;
}else if(array[mid] <target){
min = mid + 1;
}else if(array[mid] >target){
max = mid - 1;
}
}
System.out.println(index);
}
}
旋转查找
分为左旋和右旋
public class test04 {
public static void main(String[] args) {
int[] array = {1,2,3,4,5,6,7,8,9};
//右旋
for (int j =0;j<3;j++) {
for (int i = array.length - 1; i > 0; i--) {
array[i] = array[i] ^ array[i - 1];
array[i - 1] = array[i] ^ array[i - 1];
array[i] = array[i] ^ array[i - 1];
}
}
System.out.println(Arrays.toString(array));
int[] array2 = {1,2,3,4,5,6,7,8,9};
//左旋
for(int i = 0;i<array2.length-1;i++){
array2[i] = array2[i] ^ array2[i+1];
array2[i+1] = array2[i] ^ array2[i+1];
array2[i] = array2[i] ^ array2[i+1];
}
System.out.println(Arrays.toString(array2));
}
}