常见的算法
-
排序算法:冒泡排序、选择排序
-
查找算法:二分查找法
-
Java中实际上已经封装好了这些算法,例如Java中提供的一个数组工具类:java.util.Arrays中有一个静态方法sort方法。
-
对于其中的一些原理请阅读数据结构学习笔记:
①查找算法:数据结构学习第七章查找
②排序算法:数据结构学习第八章排序
7.冒泡排序算法
-
冒泡排序核心思想:
①可以从前往后(也可以从后往前),依次两两比较,不符合规则的即交换。
②经过一趟比较后,已经有一个处于正确的位置,减去这个元素继续冒泡排序。
③有n个元素,经过n-1趟排序后,排序完成。
-
用Java实现冒泡排序
public class BubbleSort {
public static void main(String[] args) {
int[] arr = {2,5,23,52,1,34};
for (int i = 0; i < arr.length; i++) {
System.out.printf(String.valueOf(arr[i]) + " "); //2 5 23 52 1 34
}
//冒泡排序实现从小到大排序
for (int i = arr.length-1; i >0; i--) {
for (int j = 0; j < i; j++) {
if(arr[j] > arr[j+1]){
int temp;
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1]=temp;
}
} }
System.out.println();
for (int i = 0; i < arr.length; i++) {
System.out.printf(String.valueOf(arr[i]) + " "); //1 2 5 23 34 52
}
}
}
8.选择排序算法
-
选择排序核心思想:
每次找出最小值与对还未排序的数据元素中第一个元素进行交换。
-
用Java实现选择排序算法
public class SelectSort {
public static void main(String[] args) {
int[] arr = {2,5,23,52,1,34};
for (int i = 0; i < arr.length; i++) {
System.out.printf(String.valueOf(arr[i]) + " "); //2 5 23 52 1 34
}
//从小到大选择排序
for (int i = 0; i < arr.length; i++) {
//记录最小值下标为:第一个元素
int min = i;
for (int j = i+1; j < arr.length; j++) {
if(arr[j]<arr[min]){
//遍历后面的元素,如果元素小于最小值,更新最小值下标
min = j;
}
}
//遍历完后面的元素,如果最小值有变,这需要更换位置。
if(min != i){
int temp;
temp = arr[min];
arr[min] = arr[i];
arr[i] = temp;
}
}
System.out.println();
for (int i = 0; i < arr.length; i++) {
System.out.printf(String.valueOf(arr[i]) + " "); //1 2 5 23 34 52
}
}
}
9.二分查找
- 普通查找就是一个一个找,也就是把数组从头到尾遍历一次,如果有就返回下标。
public class ArraySearch {
public static void main(String[] args) {
int[] arr = {2,5,23,52,1,34};
int index = Search(arr,52);
System.out.println(index == -1 ? "该元素不存在!" : "该元素下标是:" + index); //该元素下标是:3
int index2 = Search(arr,100);
System.out.println(index2 == -1 ? "该元素不存在!" : "该元素下标是:" + index2); //该元素不存在!
}
public static int Search(int[] arr,int index){
for (int i = 0; i < arr.length; i++) {
if(arr[i] == index){
return i;//结束当前方法
}
}
return -1;
}
}
-
二分法查找:在已经排序好的算法中进行查找。每次将待查记录的所在区间缩小一半
-
二分法查找核心思想:
①设表长n,设置指针low,high和mid分别指向待查元素所在区间的上界、下界和中点,key为要查找的值。
②初始,low=0,high=arr.length-1,mid=(low+high)/2。(注:由于计算机存储原理,若mid有小数部分,则向下取整数)
③让key与mid所指记录比较:
—若key==R[mid].key,查找成功
—若key<=R[mid].key,high=mid-1
—若key>=R[mid].key,low=mid+1
④重复③,直到low>high时,查找失败。
public class ArraySearchTwo {
public static void main(String[] args) {
int[] arr = {100,200,235,600,1000,2000,9999 };
//找出arr这个数组中2000所在的下标
int index = binarySeary(arr,2000);
System.out.println(index == -1 ? "该元素不存在" : "该元素的下标为:" + index);//该元素的下标为:5
int index2 = binarySeary(arr,300);
System.out.println(index2 == -1 ? "该元素不存在" : "该元素的下标为:" + index2);//该元素不存在
}
private static int binarySeary(int[] arr, int dest) {
//开始下标low
int low = 0;
//结束下标high
int high = arr.length -1;
while(low <= high){
int mid = (low + high) / 2;
if(arr[mid] == dest){
return mid;
} else if (arr[mid] < dest) {
//目标在中间的右边,开始元素下标low变化
low = mid + 1;
}else {
//目标在中间的右边,结束下标high变化
high = mid - 1;
}
}
return -1;
}
}
10. Arrays工具类使用
- 在开发中,java.util.Arrays工具类中的方法在开发中要参考API帮助文档。
- 使用工具类实现进行二分查找
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
int[] arr = {3,6,45,21,47,51,31,4,7};
//使用工具类排序
Arrays.sort(arr);
//输出排序好的结果
for (int i = 0; i < arr.length; i++) {
System.out.printf(arr[i] + " "); //3 4 6 7 21 31 45 47 51
}
System.out.println();
//二分查找(需要已经排序好的数组),使用工具类
int index = Arrays.binarySearch(arr,45);
System.out.println(index == -1 ? "该元素不存在" : "该元素下标:"+index); //该元素下标:6
}
}
——本章节为个人学习笔记。学习视频为动力节点Java零基础教程视频:动力节点—JAVA零基础教程视频