排序算法

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

简单排序

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

  • 冒泡排序代码如下:
 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(N²)级。选择排序改进了冒泡排序,将必要的交换次数从O(N²)减少到O(N),不幸的是比较次数依然是O(N²)级。然而,选择排序依然为大记录量的排序提出了一个非常重要的改进,因为这些大量的记录需要在内存中移动,这就使交换的时间和比较的时间相比起来,交换的时间更为重要。
---------------------

  • 选择排序代码如下:
 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(N²)时间。但是,选择排序无疑更快,因为它进行的交换少得多。
---------------------

  • 插入排序代码如下:
 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(N²)的时间级。当数据基本有序,插入排序几乎只需要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)²)时间,快速排序需要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

java开发过程中几种常用算法相关推荐

  1. 用java语言求前50个素数_Java求质数的几种常用算法总结

    Java求质数的几种常用算法分析 本文实例讲述了Java求质数的几种常用算法.分享给大家供大家参考,具体如下: 1.根据质数的定义求 质数定义:只能被1或者自身整除的自然数(不包括1),称为质数. 利 ...

  2. JAVA中方法的类型转换_Java中几种常用数据类型之间转换的方法

    Java中几种常用的数据类型之间转换方法: 1. short-->int 转换 exp: short shortvar=0; int intvar=0; shortvar= (short) in ...

  3. 【说说在Java开发过程中遇到的麻烦的问题】

    在 Java 开发过程中,会遇到很多问题,以下是一些可能会遇到的麻烦问题: 内存泄漏: Java 的自动垃圾回收机制可以帮助开发者自动释放不再使用的对象,但是如果代码中存在一些资源没有正确释放的情况, ...

  4. 看门狗(Watch Dog)是嵌入式系统中一种常用的保证系统可靠性的技术,()会产生看门狗中断。【详细!小白也能看懂!】

    看门狗(Watch Dog)是嵌入式系统中一种常用的保证系统可靠性的技术,()会产生看门狗中断. A. 软件喂狗 B. 处理器温度过高 C. 外部中断 D. 看门狗定时器超时 解析: 思考方式: 每个 ...

  5. java : enum、创建文件和文件夹、删除文件和文件夹、获得项目绝对路径、写入数据到excel中、java代码中两种路径符号写法、读取、写入text文件...

    java : enum http://www.cnblogs.com/hyl8218/p/5088287.html 创建文件和文件夹.删除文件和文件夹 http://www.cnblogs.com/m ...

  6. 写出python字符串三种常用的函数或方法_python中几种常用字符串函数

    1.lower()把所有字符换成小写 2.upper()把所有字符换成大写 3.swapcase()大小写互换 4.title()把每个单词首字母大写,他是以所有英文字母的字符来区别是否为一个单词的, ...

  7. matlab的数值计算方法,数值计算方法中的一些常用算法的Matlab源码

    数值计算方法中的一些常用算法的Matlab源码,这些程序都是原创,传上来仅供大家参考,不足之处请大家指正,切勿做其它用途-- 说明:这些程序都是脚本函数,不可直接运行,需要创建函数m文件,保存时文件名 ...

  8. 深入了解Java开发过程中的类型转换

    Java开发过程中有一个特性需要我们注意,整型.实型(常量).字符型数据可以进行混合运算. 所以,在运算过程中,不同类型的数据会先转化为同一类型,然后进行运算. 深入了解Java开发过程中的类型转换 ...

  9. Java语言中几个常用的包

    Java语言中几个常用的包 Java采用包结构来组织和管理类和接口文件.本文介绍Java语言类库中几个常用的包,因为这几个包在软件开发与应用中经常需要用到,其中有些包是必要的.若是离开它,还真不能做事 ...

最新文章

  1. 厉害了!写代码、搜问题,全部都在「终端」完成!如此编程神器,是时候入手了...
  2. docker 厂商 容器_中国容器厂商综合实力排名,新鲜出炉!
  3. Cloudera Manager5安装总结遇到问题及解决办法
  4. 什么是信息服务外包?
  5. react 引用本地js_从零配置webpack 4+react脚手架(二)
  6. 使用的 SQL Server 版本不支持数据类型“datetime2”解决办法
  7. Linux基础:find命令总结
  8. 【计算机网络】简单网络管理协议 SNMP
  9. 13个你必须知道的JS数组技巧
  10. oracle只能在指定目录下访问,只安装PLSQL怎么访问远程数据库
  11. Android-动画简介
  12. 美团智能搜索推荐模型预估框架的建设与实践
  13. 帝国cms怎么搭建python环境_用python 发 帝国cms 文章
  14. 服务器系统排行榜,5大主流服务器操作系统对比导购
  15. 信息化管理系统在企业的应用
  16. 标准Modbus通讯协议格式
  17. 盒子模型与内外边距设置
  18. 2019全网最全面试详解.
  19. Unity Texture2D byte[] sprit转换
  20. COSCon'22 杭州会场回顾 | 谁说开源人只懂代码不懂玩?

热门文章

  1. HDU 1879 继续畅通工程 最小生成树
  2. Flutter LayoutBuilder 用来获取父布局的尺寸大小
  3. flutter AnimatedPositionedDirectional 使用解析
  4. Linux 环境下 gzip 的加解密命令
  5. tensorflow with gpu 环境配置
  6. C++ primer 11章关联容器
  7. mac 下的实用工具总结
  8. jquery查找元素方法示例
  9. 格式化字符串长度 超出指定长度用....代替
  10. 动态加载TreeView