1.二分法查找
前提:所查找的数组必须有序
代码实现:
package yewenling;
public class ArrayTest6 {
public static void main(String[] args) {
int[] array = new int[] {-98,-34,2,34,54,66,79,105,210,333};
int dest1 = -35;
int head =0;
int end = array.length-1;
boolean att = true;
while(head<=end) {
int middle = (head+end)/2;
if(dest1==array[middle]) {
System.out.println("dest1在数组中的位置为:"+middle);
att = false;
break;
}else if(dest1<array[middle]) {
end = middle-1;
}else if(dest1>array[middle]) {
head = middle+1;
}
}
if(att) {
System.out.println("很遗憾,没有找到这个数");
}
}
}
2.算法与排序算法
1.算法的5大特征
1.输入( Input):有0个或多个输入数据,这些输入必须有清楚的描述和定义
2.输出( Output):至少有1个或多个输出结果,不可以没有输出结果
3有穷性(有限性,Finiteness ):算法在有限的步骤之后会自动结束而不会无限循环,并且每一个步骤可以在可接受的时间内完成
4.确定性(明确性,Definiteness ):算法中的每一步都有确定的含义,不会出现二义性
5.可行性(有效性,Effectiveness ):算法的每一步都是清楚且可行的,能让用户用纸笔计算而求出答案
说明:满足确定性的算法也称为:确定性算法。现在人们也关注更广泛的概念,例如考虑各种非确定性的算法,如并行算法、概率算法等。另外,人们也关注并不要求终止的计算描述,这种描述有时被称为过程( procedure) 。
2.衡量排序算法的优劣:
- 时间复杂度:分析关键字的比较次数和记录的移动次数
- 空间复杂度:分析排序算法中需要多少辅助内存
- 稳定性:若两个记录A和B的关键字值相等,但排序后A、B的先后次序保持不变,则称这种排序算法是稳定的。
3.排序算法分类:内部排序和外部排序。
- 内部排序:整个排序过程不需要借助于外部存储器(如磁盘等),所有排序操作都在内存中完成。
- 外部排序:参与排序的数据非常多,数据量非常大。计算机无法把整个排序过程放在内存中完成,:必须借助于外部存储器〈如磁盘)。外部排序最常见的是多路归并排序。可以认为外部排序是由多次内部排序组成。
4.十大内部排序法(前八个为常用的排序方法):
1.选择排序法:直接选择排序、堆排序;
2.交换排序:冒泡排序、快速排序;
3.插入排序:直接插入排序、折半插入排序、shell排序;
4.归并排序
5.桶式排序
6.基数排序
5.冒泡排序 (O())
代码实现:
package suanfa;
/*
* 冒泡排序
*
*
*/
public class BubbleSort {
public static void main(String[] args) {
int[] arr = new int[] {32,45,12,878,652,-2};
for(int i=0;i<arr.length-1;i++) {
int max;
for(int j=0;j<arr.length-1-i;j++) {
if(arr[j]>arr[j+1]) {
max=arr[j];
arr[j]=arr[j+1];
arr[j+1]=max;
}
}
}
for(int i=0;i<arr.length;i++) {
System.out.print(arr[i]+"\t");
}
}
}
6.快速排序(O(n))
https://blog.csdn.net/weixin_37817685/article/details/79969349
3.Arrays工具类
package suanfa;
/*
* java.util.Arrays :操作数组的工具类,里面定义了很多操作数组的方法
*
*
*/
import java.util.Arrays;
public class Arraystest {
public static void main(String[] args) {
//1.boolean equals(int[] a,int[] b):判断两个数组是否相等
int[] num1 = new int[] {1,3,2,4};
int[] num2 = new int[] {1,2,3,4};
int[] num3 = new int[] {-10,1,3,5,8,21,22,44,67,100};
boolean IsEquals = Arrays.equals(num1, num2);
System.out.println(IsEquals);
//2.String toString(int[] a):输出数组信息
System.out.println(Arrays.toString(num1));
//3.void fill(int[] a,int val):将指定的值填充到数组当中(即将原来的参数替换为指定的值)
Arrays.fill(num2, 0);
System.out.println(Arrays.toString(num2));
//4.void sort(int[] a):对数组进行排序
Arrays.sort(num1);
System.out.println(Arrays.toString(num1));
//5.int binarySearch(int[] a,int key):二分查找
int index = Arrays.binarySearch(num3, 8);
System.out.println(index);
}
}