首页 > 编程语言 >几种常用的Java 算法

几种常用的Java 算法

时间:2023-04-09 18:34:09浏览次数:33  
标签:arr right Java temp int 几种 算法 static left

package jsh.mg.msg.service.msg.test;

import java.util.Arrays;

import static java.util.Arrays.binarySearch;


/**
*
* 几种常用的Java 算法
*/
public class TestClass {


/**
*
* 二分查找算法
*/


public static int binarySearch(int[] arr, int target) {
int left = 0;
int right = arr.length - 1;

while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid] == target) {
return mid;
} else if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}

return -1;
}

// public static void main(String[] args) {
// int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
// int target = 5;
// int index = binarySearch(arr, target);
// if (index == -1) {
// System.out.println("没有找到目标值");
// } else {
// System.out.println("目标值在数组中的位置是:" + (index+1));
// }
// }


/**
* 冒泡排序算法
*
* @param args
*/


public static void sortMethod(int arr[]) {

int len = arr.length;
for (int i = 0; i < len - 1; i++) {
for (int j = 0; j < len - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}

// public static void main(String[] args) {
//
// int arr[] = {50, 30, 10, 20, 40, 70, 60};
//
// sortMethod(arr);
// System.out.println("排序后的数组为:");
// for (int i = 0; i < arr.length; i++) {
// System.out.println(arr[i] + "");
// }
// }


/**
* 插入排序算法
*
* @param arr
*/
public static void sort(int[] arr) {
int n = arr.length;
for (int i = 1; i < n; i++) {
int key = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
}

// public static void main(String[] args) {
// int[] arr = {4, 2, 9, 3, 5};
// sort(arr);
// for (int i : arr) {
// System.out.print(i + " ");
// }
// }

/**
* 快速排序算法
*/
public static void quickSort(int[] arr, int start, int end) {
if (start < end) {
int pivotIndex = partition(arr, start, end); // 获取分区点
quickSort(arr, start, pivotIndex - 1); // 对左半部分进行快速排序
quickSort(arr, pivotIndex + 1, end); // 对右半部分进行快速排序
}
}

// 分区函数
public static int partition(int[] arr, int start, int end) {
int pivot = arr[start]; // 选取第一个元素作为分区点
int left = start + 1;
int right = end;
while (left <= right) {
// 搜索大于等于 pivot 的元素位置
while (left <= right && arr[left] < pivot) {
left++;
}
// 搜索小于等于 pivot 的元素位置
while (left <= right && arr[right] > pivot) {
right--;
}
if (left <= right) {
// 交换元素位置
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
}
// 将分区点放入正确的位置上
int temp = arr[start];
arr[start] = arr[right];
arr[right] = temp;
return right;
}

// public static void main(String[] args) {
// int[] arr = {5, 3, 8, 6, 4};
// quickSort(arr, 0, arr.length - 1);
// for (int i : arr) {
// System.out.print(i + " ");
// }
// }


/**
*
* 希尔排序算法
* @param args
*/

public static void shellSort(int[] arr) {
int len = arr.length;
int h = 1;
while (h < len / 3) {
h = 3 * h + 1; // Knuth序列
}
while (h >= 1) {
for (int i = h; i < len; i++) {
for (int j = i; j >= h && arr[j] < arr[j - h]; j -= h) {
swap(arr, j, j - h);
}
}
h /= 3;
}
}

private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}

// public static void main(String[] args) {
// int arr[] = {2,4,1,6,3,8};
//
// shellSort(arr);
//
// for (int i : arr) {
// System.out.println(i + "");
// }
// }


/**
* 归并排序算法
*
* @param arr
*/
public static void mergeSort(int[] arr) {
if (arr == null || arr.length == 0) {
return;
}
int[] temp = new int[arr.length];// 申请一个与原数组相同大小的临时数组
mergeSort(arr, 0, arr.length - 1, temp);// 调用递归函数排序
}

private static void mergeSort(int[] arr, int left, int right, int[] temp) {
if (left < right) {
int mid = (left + right) / 2;
mergeSort(arr, left, mid, temp);// 左子序列归并排序
mergeSort(arr, mid + 1, right, temp);// 右子序列归并排序
merge(arr, left, mid, right, temp);// 合并两个有序子序列
}
}

private static void merge(int[] arr, int left, int mid, int right, int[] temp) {
int i = left;// 左序列指针
int j = mid + 1;// 右序列指针
int t = 0;// 临时数组指针
while (i <= mid && j <= right) {
if (arr[i] <= arr[j]) {// 如果左序列当前元素不大于右序列当前元素
temp[t++] = arr[i++];// 将左序列当前元素拷贝到临时数组中
} else {// 如果左序列当前元素大于右序列当前元素
temp[t++] = arr[j++];// 将右序列当前元素拷贝到临时数组中
}
}
while (i <= mid) {// 如果右序列已经全部拷贝到临时数组中,而左序列还有剩余
temp[t++] = arr[i++];// 继续将左序列剩余元素拷贝到临时数组中
}
while (j <= right) {// 如果左序列已经全部拷贝到临时数组中,而右序列还有剩余
temp[t++] = arr[j++];// 继续将右序列剩余元素拷贝到临时数组中
}
t = 0;// 将归并后的临时数组拷贝回原数组
while (left <= right) {
arr[left++] = temp[t++];
}
}

// public static void main(String[] args) {
// int[] arr = {3, 5, 2, 6, 1, 4};
// mergeSort(arr);
// for (int i : arr) {
// System.out.print(i + " ");
// }
// }

}

标签:arr,right,Java,temp,int,几种,算法,static,left
From: https://www.cnblogs.com/pxzbky/p/17300755.html

相关文章

  • JS引擎(1):JS引擎擂台赛,JavaScript引擎的特征比较及术语科普
    上篇介绍过JavaScript引擎的历史,《JS引擎(0):起底各种JavaScript引擎群雄争霸之路》一些流行的JavaScript引擎SpiderMonkey ,BrendanEich在Netscape创建,由C/C++语言开发,可适配ECMA-262Edition5及其之后的标准版本Rhino,由NorrisBoyd(归属Netscape)创建,则是一个Ja......
  • JS引擎(2):Java平台上JavaScript引擎—Rhino/Nashorn概述
    可以后端开发的javascript引擎有ChromeV8基于C++java的Rhino引擎(JDK6被植入),Java8被替换为NashornRhino和Nashorn都是用Java实现的JavaScript引擎。它们自身都是普通的Java程序,运行在JVM上Rhino简介Rhino[ˈraɪnəʊ]是一种使用Java语言编写的JavaScript的......
  • JS引擎(0):JavaScript引擎群雄演义—起底JavaScript引擎
    JavaScript既是一个 面向过程的语言 又是一个 面向对象的语言。在JavaScript中,通过在运行时给空对象附加方法和属性来创建对象,与编译语言如C++和Java中常见的通过语法来定义类相反。对象构造后,它可以用作是创建相似对象的原型。JavaScript的动态特性包括运行时构造对......
  • 推荐算法在商城系统实践
    一、简介本文博主给大家讲解如何在自己开源的电商项目newbee-mall-pro中应用协同过滤算法来达到给用户更好的购物体验效果。newbee-mall-pro项目地址:源码地址:https://github.com/wayn111/newbee-mall-pro在线地址:http://121.4.124.33/newbeemall二、协同过滤算法协同过......
  • Java: switch lambda-like syntax
     Theswitchexpressionhasanadditionallambda-likesyntaxanditcanbeusednotonlyasastatement,butalsoasanexpressionthatevaluatestoasinglevalue. Withthenewlambda-likesyntax,ifalabelismatched,thenonlytheexpressionorstat......
  • JavaWeb-24课-filter-2023-04-09
    Servlet类,没有乱码处理packagecom.feijian.servlet;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;public......
  • 算法思想
    \(\mathcal{Part}\)1.前提提要注意:本文为提高组难度的算法思想,主要为前缀和,差分等优化因为是思想,讲的会比较玄乎,能理解就好\(\mathcal{Part}\)2.双指针双指针通常解决区间问题步骤是,确定一个右节点或左节点作为一个参考点,通常取右节点,记为\(j\)我们考虑一个刚好符合题......
  • Golang与Java全方位对比总结
    本文针对Golang与Java的基础语法、结构体函数、异常处理、并发编程及垃圾回收、资源消耗等各方面的差异进行对比总结,有不准确、不到位的地方还请大家不吝赐教。一、基础语法Golang:编码风格及可见域规则严格且简单;Java:来说层次接口清晰、规范,主要表现有以下这些。1、变量......
  • leetcode56.合并区间-java
    1classSolution{2publicint[][]merge(int[][]intervals){3/*4思路:左区间排序,若intervals[i][0]>=intervals[i-1][1];则重叠5将重叠区间新建放入res数组里,没重叠则放入原数组6*/7List<int[]>......
  • 人工智能概率算法-模拟神经元结构预测价格
    最近研究人工智能概率算法,想通过统计学的方式预测未来比较好的例子就是股票,历史数据很丰富输入端:4个参数(开盘价、最高价、最低价、收盘价)输出端:4个参数第二天(开盘价、最高价、最低价、收盘价)把价格从-10到+10,每次迭代0.1,分类成200个特征刚开始神经元的输入端不敏感,细胞核不......