java开发过程中几种常用算法

排序算法

排序算法中包括:简单排序、高级排序

简单排序

简单排序常用的有:冒泡排序、选择排序、插入排序

  • 冒泡排序代码如下:
 1 private static void bubbleSrot(int[] arr) {
 2
 3 for (int i = 0; i < arr.length - 1; i++) {
 4
 5 for (int j = i + 1; j < arr.length; j++) {
 6
 7 if (arr[i] > arr[j]) {
 8
 9 int temp = arr[i];
10
11 arr[i] = arr[j];
12
13 arr[j] = temp;
14
15 }
16
17 }
18
19 }
20
21 }

  冒泡排序方法速度是很慢的,运行时间为O(N2)级。选择排序改进了冒泡排序,将必要的交换次数从O(N2)减少到O(N),不幸的是比较次数依然是O(N2)级。然而,选择排序依然为大记录量的排序提出了一个非常重要的改进,因为这些大量的记录需要在内存中移动,这就使交换的时间和比较的时间相比起来,交换的时间更为重要。
---------------------

  • 选择排序代码如下:
 1 private static void chooseSort(int[] arr) {
 2
 3 for (int i = 0; i < arr.length; i++) {
 4
 5 int least = i;
 6
 7 for (int j = i + 1; j < arr.length; j++) {
 8
 9 if (arr[j] < arr[least]) {
10
11 least = j;
12
13 }
14
15 }
16
17 // 将当前第一个元素与它后面序列中的最小的一个 元素交换,也就是将最小的元素放在最前端
18
19 int temp = arr[i];
20
21 arr[i] = arr[least];
22
23 arr[least] = temp;
24
25 }
26
27 }

  选择排序的效率:选择排序和冒泡排序执行了相同次数的比较:N*(N-1)/2。对于10个数据项,需要45次比较,然而,10个数据项只需要少于10次的交换。对于100个数据项,需要4950次比较,但只进行不到100次交换。N值很大时,比较的次数是主要的,所以结论是选择排序和冒泡哦排序一样运行了O(N2)时间。但是,选择排序无疑更快,因为它进行的交换少得多。
---------------------

  • 插入排序代码如下:
 1 private static void insertionSort(int[] arr) {
 2
 3 int in, out;
 4
 5 for (out = 1; out < arr.length; out++) {
 6
 7 int temp = arr[out];
 8
 9 in = out;
10
11 while (in > 0 && arr[in - 1] >= temp) {
12
13 arr[in] = arr[in - 1];
14
15 --in;
16
17 }
18
19 arr[in] = temp;
20
21 }
22
23 }

  插入排序的效率:这个算法中,第一趟排序,最多比较一次,第二趟排序,最多比较两次,以此类推,最后一趟最多比较N-1次,因此有1+2+3+…+N-1 = N*(N-1)/2。然而,因为在每一趟排序发现插入点之前,平均只有全体数据项的一半真的进行了比较,所以除以2最后是N*(N-1)/4。
对于随机顺序的数据,插入排序也需要O(N2)的时间级。当数据基本有序,插入排序几乎只需要O(N)的时间,这对把一个基本有序的文件进行排序是一个简单而有效的方法。
  对于逆序排列的数据,每次比较和移动都会执行,所以插入排序不比冒泡排序快。
---------------------

  • 归并排序

 1 // 将两个已排序的数组合并到第三个数组上。
 2
 3 private static void merge(int[] arrA, int[] arrB, int[] arrC) {
 4
 5 int aDex = 0, bDex = 0, cDex = 0;
 6
 7 int sizeA = arrA.length;
 8
 9 int sizeB = arrB.length;
10
11
12 // A数组和B数组都不为空
13
14 while (aDex < sizeA && bDex < sizeB) {
15
16 if (arrA[aDex] < arrB[bDex]) {
17
18 arrC[cDex++] = arrA[aDex++];
19
20 } else {
21
22 arrC[cDex++] = arrB[bDex++];
23
24 }
25
26 }
27
28 // A数组不为空,B数组为空
29
30 while (aDex < sizeA) {
31
32 arrC[cDex++] = arrA[aDex++];
33
34 }
35
36 // A数组为空,B数组不为空
37
38 while (bDex < sizeB) {
39
40 arrC[cDex++] = arrB[bDex++];
41
42 }
43
44 }

高级排序

  常见的高级排序:哈希排序、快速排序,这两种排序算法都比简单排序算法快得多:希尔排序大约需要O(N*(logN)2)时间,快速排序需要O(N*logN)时间。这两种排序算法都和归并排序不同,不需要大量的辅助存储空间。希尔排序几乎和归并排序一样容易实现,而快速排序是所有通用排序算法中最快的一种排序算法。 还有一种基数排序,是一种不常用但很有趣的排序算法。

  • 哈希排序

  哈希排序是基于插入排序的,实现代码如下:

 1 private static void shellSort(int[] arr) {
 2
 3 int inner, outer;
 4
 5 int temp;
 6
 7 int h = 1;
 8
 9 int nElem = arr.length;
10
11 while (h <= nElem / 3) {
12
13 h = h * 3 + 1;
14
15 }
16
17 while (h > 0) {
18
19 for (outer = h; outer < nElem; outer++) {
20
21 temp = arr[outer];
22
23 inner = outer;
24
25 while (inner > h - 1 && arr[inner - h] >= temp) {
26
27 arr[inner] = arr[inner - h];
28
29 inner -= h;
30
31 }
32
33 arr[inner] = temp;
34
35 }
36
37 h = (h - 1) / 3;
38
39 }
40
41 }
42 --------------------- 
  • 快速排序

  快速排序是最流行的排序算法,在大多数情况下,快速排序都是最快的,执行时间是O(N*logN)级,划分是快速排序的根本机制。划分本身也是一个有用的操作。 划分数据就是把数据分为两组,使所有关键字大于特定值的数据项在一组,所有关键字小于特定值的数据项在另一组。代码实现如下:

 1 // 快速排序
 2
 3 private static void recQuickSort(int arr[], int left, int right) {
 4
 5 if (right - left <= 0) {
 6
 7 return;
 8
 9 } else {
10
11 int pivot = arr[right];// 一般使用数组最右边的元素作为枢纽
12
13 int partition = partitionIt(arr, left, right, pivot);
14
15 recQuickSort(arr, left, partition - 1);
16
17 recQuickSort(arr, partition + 1, right);
18
19 }
20
21 }
22
23
24 // 划分
25
26 private static int partitionIt(int[] arr, int left, int right, int pivot) {
27
28 int leftPtr = left - 1;
29
30 // int rightPtr = right + 1;
31
32 int rightPtr = right; // 使用最右边的元素作为枢纽,划分时就要将最右端的数据项排除在外
33
34 while (true) {
35
36 while (arr[++leftPtr] < pivot)
37
38 ;
39
40 while (rightPtr > 0 && arr[--rightPtr] > pivot)
41
42 ;
43
44
45 if (leftPtr >= rightPtr) {
46
47 break;
48
49 } else {
50
51 // 交换leftPtr和rightPtr位置的元素
52
53 int temp = arr[leftPtr];
54
55 arr[leftPtr] = arr[rightPtr];
56
57 arr[rightPtr] = temp;
58
59 }
60
61 }
62
63 // 交换leftPtr和right位置的元素
64
65 int temp = arr[leftPtr];
66
67 arr[leftPtr] = arr[right];
68
69 arr[right] = temp;
70
71 return leftPtr;// 返回枢纽位置
72
73 }
74 --------------------- 

查找算法

对于有序的数组,常用的查找算法:二分查找。代码如下:

 1 private static int find(int [] arr,int searchKey){
 2
 3         int lowerBound = 0;
 4
 5         int upperBound = arr.length -1;
 6
 7         int curIn;
 8
 9         while(lowerBound <= upperBound){
10
11             curIn = (lowerBound + upperBound) / 2;
12
13             if(arr[curIn] == searchKey){
14
15                 return curIn;
16
17             }else{
18
19                 if(arr[curIn] < searchKey){
20
21                     lowerBound = curIn + 1;
22
23                 }else{
24
25                     upperBound = curIn - 1;
26
27                 }
28
29             }
30
31         }
32
33         return -1;
34
35     }
36 --------------------- 

原文地址:https://www.cnblogs.com/Mr-Elliot/p/10015459.html

时间: 2024-11-10 15:54:52

java开发过程中几种常用算法的相关文章

Java 中几种常用的线程池

Java 中几种常用的线程池 转载 : https://www.cnblogs.com/sachen/p/7401959.html 原创 2016年04月14日 23:29:01 标签: java / 线程池 / Executor 878 概述: 在java内置API中操作线程所用到的类为Thread.创建线程一般有两种方式, 继承Thread方式 实现Runnable方式,并以runnable作为target创建Thread 在Android中的耗时任务一般都需要另开线程来执行,常常需要用线程

java 中几种常用数据结构

Java中有几种常用的数据结构,主要分为Collection和map两个主要接口(接口只提供方法,并不提供实现),而程序中最终使用的数据结构是继承自这些接口的数据结构类. 一.几个常用类的区别 1.ArrayList: 元素单个,效率高,多用于查询 2.Vector: 元素单个,线程安全,多用于查询 3.LinkedList:元素单个,多用于插入和删除 4.HashMap: 元素成对,元素可为空 5.HashTable: 元素成对,线程安全,元素不可为空 二.Vector.ArrayList和L

Java中几种常用的设置小数点后位数的方法

记录下几种常用的控制小数点后位数的方法,除了这几种还有很多方法也可以控制,但是用得不常见,下面是比较常见的几种方法 使用BigDecimal类对超长数字进行格式化控制 使用DecimalFormat格式化十进制数字 使用printf格式化输出 具体实现 package _12_26_test; import java.math.BigDecimal; import java.math.BigInteger; import java.text.DecimalFormat; /*控制小数点后位数的几

DotNet中几种常用的加密算法

在.NET项目中,我们较多的使用到加密这个操作.因为在现代的项目中,对信息安全的要求越来越高,那么多信息的加密就变得至关重要.现在提供几种常用的加密/解密算法. 1.用于文本和Base64编码文本的互相转换 和 Byte[]和Base64编码文本的互相转换: (1).将普通文本转换成Base64编码的文本        /// <summary>         /// 将普通文本转换成Base64编码的文本        /// </summary>         /// &l

Java常见的几种排序算法-插入、选择、冒泡、快排、堆排等

本文就是介绍一些常见的排序算法.排序是一个非常常见的应用场景,很多时候,我们需要根据自己需要排序的数据类型,来自定义排序算法,但是,在这里,我们只介绍这些基础排序算法,包括:插入排序.选择排序.冒泡排序.快速排序(重点).堆排序.归并排序等等.看下图: 给定数组:int data[] = {9,2,7,19,100,97,63,208,55,78} 一.直接插入排序(内部排序.O(n2).稳定) 原理:从待排序的数中选出一个来,插入到前面的合适位置. [java] view plain copy

Java语言中几个常用的包

Java采用包结构来组织和管理类和接口文件.本文介绍Java语言类库中几个常用的包,因为这几个包在软件开发与应用中经常需要用到,其中有些包是必要的.若是离开它,还真不能做事情了. 第一个包:java.lang包.     该包提供了Java语言进行程序设计的基础类,它是默认导入的包.该包里面的Runnable接口和Object.Math.String.StringBuffer.System.Thread以及Throwable类需要重点掌握,因为它们应用很广.   第二个包:java.util包.

java开发过程中从前台传到后台中文乱码《filter》

在企业开发中,最常见的是javaweb项目,有web项目就免不了和后台打交道,比如我从jsp页面发送新增请求到后台,后台可能是servlet.struts2.springmvc等,这时就存在一个问题,在发送的参数值中如果包含中文经常到了后台你发现会是乱码,当然你可以在后台拿到值后对值进行重新编码,但是如果每次都要进行重新编码,会很麻烦,这里介绍一中简单的方式,希望可以对你有用. filter filter叫做过滤器,是java servlet中的技术,通过filter我们可以对要访问的web服务

项目开发过程中,一些常用的方法

以下一些在开发过程中封装的常用方法,供参考由于一些方法是很久之前写下来的,语法上比较旧,再使用的时候再进行修改//获取当前时刻的时间 // type = 1年月日,type=2时分秒,fommatter="-"表示年月日用-隔开,否则用"/"隔开 export function curTimeFun(type,fommatter) { const myDate = new Date(); const year = myDate.getFullYear()>9?

判断Java对象死亡的两种常用算法

当对象不馁引用的时候,这个对象就是死亡的,等待GC进行回收. 1.引用计数法 概念: 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就增加1:当应用失效时,计数器值就减1:任何时刻计数器为0是对象就是不可能再被使用的. 但是: 主流的java虚拟机并没有选用引用计数器算法,其中一个最主要的原因是:它很难解决对象之间是相互循环引用. 优点:算法的实现简单,判定效率高,大部分情况下是一个不错的算法.很多地方应用到它 缺点: 引用和去引用伴随假发和减法,影响性能. 致命的缺陷:对于循环引