Java相关的基本算法

简介: 执行效率从快到慢:快速、希尔、插入、选择、冒泡排序

执行效率从快到慢:快速、希尔、插入、选择、冒泡排序


1.数组逆序

实现思想:第一个递增,最后一个递减

//数组元素逆序
public static void receive(int[] arr){
  for (int start = 0, end = arr.length-1; start < end; start++,end--) {
  int temp = arr[start];
  arr[start] = arr[end];
  arr[end] = temp;
  }
}
int[] arr = {3, 4, 6, 1, 2, 7, 8, 5, 9};
receive(arr);
//输出结果:9,5,8,7,2,1,6,4,3


2.选择排序

实现思想:从左往右比较找到最小值,从左往右依次排放。

// 选择排序
public static void select_sort(int[] arr) {
   for (int i = 0; i < arr.length - 1; i++) {
    //选择排序的优化
    int k = i;
    for (int j = k + 1; j < arr.length - 1; j++) {
      // 找到最小值的下标
      if (arr[j] < arr[k]) {
      k = j;
      }
    }
    if (k != i) {
      int temp = arr[i];
      arr[i] = arr[k];
      arr[k] = temp;
    }
   }
}
int[] arr = {3, 4, 6, 1, 2, 7, 8, 5, 9};
select_sort(arr);
//输出结果:1,2,3,4,5,6,7,8,9

深入了解:https://www.cnblogs.com/shen-hua/p/5424059.html


3.冒泡排序

实现思想:从头开始,依次相邻比较,把最大的放到最后边

//冒泡排序
public static void bubbleSort(int[] arr) {
  //功能
  //外层循环用来控制数组循环的圈数
  for (int i = 0; i < arr.length-1; i++) {
  //j < arr.length-1 为了避免角标越界
  //j < arr.length-1-i 为了比较效率,避免重复比较
  //内层循环用来完成元素值比较,把大的元素值互换到后面
  for (int j = 0; j < arr.length-1-i; j++) {
    if (arr[j] > arr[j+1]) {
    int temp = arr[j];
    arr[j] = arr[j+1];
    arr[j+1] = temp;
    }
  }
  }
}
int[] arr = {3, 4, 6, 1, 2, 7, 8, 5, 9};
bubbleSort(arr);
//输出结果:1,2,3,4,5,6,7,8,9


4.普通查找

实现思想:遍历数组,查找相同的元素

//普通查找
public static int getArrayIndex(int[] arr, int number) {
  //把数组中的元素依次与指定的数值 进行比较
  for (int i = 0; i < arr.length; i++) {
  if (arr[i] == number) {
    //找到了
    return i;
  }
  }
  return -1;
}
int[] arr = {3, 4, 6, 1, 2, 7, 8, 5, 9};
int arrayIndex = getArrayIndex(arr, 1);
System.out.println(arrayIndex);
//输出结果:3


5.二分法查找

实现思想:已知是排好序的数组,用中间元素和要查找的元素比较,大的话取左边

//二分查找法(折半查找法)
public static int halfSearch(int[] arr, int number) {
  //定义3个变量,用来记录min, min, mid的位置
        int min = 0;
        int max = arr.length-1;
        int mid = 0;
        while (min <= max) {
            mid = (min + max) / 2;
            //没找到更新范围,继续比较
            if (arr[mid] > number) {
                //在左边
                max = mid - 1;
            } else if (arr[mid] < number) {
                //在右边
                min = mid + 1;
            } else {
                return mid;
            }
        }
        return -1;
}
int[] arr = {3, 4, 6, 1, 2, 7, 8, 5, 9};
bubbleSort(arr);
int arrayIndex = halfSearch(arr, 3);
System.out.println(arrayIndex);
//输出结果:2

https://www.cnblogs.com/kangyi/p/4262169.html


6.快排

实现思想:小的放前边,找一个index,放最小的索引,循环一轮得到一个最小值

public static void quickSort(int[] arr) {
  if (null == arr) {
  System.out.println("传入的数组为空!!!");
  }
  for (int i =0;i < arr.length;i++) {
  int index = i;
  for (int j = i;j < arr.length;j++) {
    if (arr[index] > arr[j]) {
    index = j;
    }
  }
  if (index != i) {
    int temp = arr[index];
    arr[index] = arr[i];
    arr[i] = temp;
  }
  }
}
int[] arr = {3, 4, 6, 1, 2, 7, 8, 5, 9};
quickSort(arr);
//输出结果:1,2,3,4,5,6,7,8,9


7.快速排序

实现思想:挖坑填数+分治法

思想:先取一个基数,下标从右向左找比基数小的,从左向右找比基数大的,找到和基数互换位置,然后进行下一轮操作,然后递归调用快排算法。

public static void quick_sort(int[] arr, int l, int r) {
  if (l < r) {
  // 确定数组下标的范围
  int i = l, j = r;
  // 先确定基准数
  int flag = arr[l];
  while (i < j) {
    // 下标j从右往左递减,找比基数小的数
    while (i < j && flag < arr[j])
    j--;
    if (i < j) {
    // 找到填补基数坑
    arr[i] = arr[j];
    i++;
    }
    // 下标i从左往右递增,找比基数大的数
    while (i < j && flag > arr[i])
    i++;
    if (i < j) {
    // 找到填补新坑
    arr[j] = arr[i];
    j--;
    }
  }
  // 将原来的基准值放入中间数
  arr[j] = flag;
  // 递归调用
  // 中间数的左边递归调用
  quick_sort(arr, l, i - 1);
  // 中间数的右边递归调用
  quick_sort(arr, i + 1, r);
  }
}


8.递归算法

优点:

1.代码简洁

2.在树的遍历算法中,递归的实现比循环多

缺点:

1.由于是函数调用自身,时间和空间消耗比较大

2.递归中很多计算都是重复的,效率比较低

递归的优化:

使用动态规划:将可能出现的结果全部计算并保存,直到得到所需要的结果

int Fib(unsigned n)
{
    if(n==1)return 1;
    if(n==0)return 0;
    return Fib(n-1)+Fib(n-2);
}
int Fib(unsigned n)
{
    int* f=new int[n+1];
    f[1]=1;f[0]=0;
    for(int i=0;i<=n;i++);
        f[i]=f[i-1]+f[i-2];  
    int r=f[n];
    return r;
}
目录
相关文章
|
2月前
|
负载均衡 NoSQL 算法
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
这篇文章是关于Java面试中Redis相关问题的笔记,包括Redis事务实现、集群方案、主从复制原理、CAP和BASE理论以及负载均衡算法和类型。
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
|
2月前
|
搜索推荐 算法 Java
手写快排:教你用Java写出高效排序算法!
快速排序(QuickSort)是经典的排序算法之一,基于分治思想,平均时间复杂度为O(n log n),广泛应用于各种场合。在这篇文章中,我们将手写一个Java版本的快速排序,从基础实现到优化策略,并逐步解析代码背后的逻辑。
79 1
|
2月前
|
设计模式 缓存 算法
揭秘策略模式:如何用Java设计模式轻松切换算法?
【8月更文挑战第30天】设计模式是解决软件开发中特定问题的可重用方案。其中,策略模式是一种常用的行为型模式,允许在运行时选择算法行为。它通过定义一系列可互换的算法来封装具体的实现,使算法的变化与客户端分离。例如,在电商系统中,可以通过定义 `DiscountStrategy` 接口和多种折扣策略类(如 `FidelityDiscount`、`BulkDiscount` 和 `NoDiscount`),在运行时动态切换不同的折扣逻辑。这样,`ShoppingCart` 类无需关心具体折扣计算细节,只需设置不同的策略即可实现灵活的价格计算,符合开闭原则并提高代码的可维护性和扩展性。
40 2
|
2月前
|
安全 算法 Java
java系列之~~网络通信安全 非对称加密算法的介绍说明
这篇文章介绍了非对称加密算法,包括其定义、加密解密过程、数字签名功能,以及与对称加密算法的比较,并解释了非对称加密在网络安全中的应用,特别是在公钥基础设施和信任网络中的重要性。
|
2月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
39 6
|
2月前
|
搜索推荐 算法 Java
经典排序算法之-----选择排序(Java实现)
这篇文章通过Java代码示例详细解释了选择排序算法的实现过程,包括算法的基本思想、核心代码、辅助函数以及测试结果,展示了如何通过选择排序对数组进行升序排列。
经典排序算法之-----选择排序(Java实现)
|
2月前
|
搜索推荐 算法 Java
|
2月前
|
存储 算法 Java
LeetCode经典算法题:打家劫舍java详解
LeetCode经典算法题:打家劫舍java详解
53 2
|
2月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
41 1
|
2月前
|
存储 算法 Java
LeetCode经典算法题:预测赢家+香槟塔java解法
LeetCode经典算法题:预测赢家+香槟塔java解法
40 1
下一篇
无影云桌面