第二章:排序算法 及其他 Java代码实现
第二章:排序算法 及其他 Java代码实现
——算法导论(Introduction to Algorithms, Third Edition)
插入排序
//打印输出数组模块
public class PrintArrays
{
public static void printA(int []A)
{
for (int aInput : A)
{
System.out.print(aInput+ " ");
}
}
}
//产生随机数组模块
import java.util.*;
public class RandomArray
{
public static int[] randomArray( int num)
{
Random rad =new Random(System.currentTimeMillis());
int array[] = new int[num];
for (int i= 0 ; i<num ; i++)
{
array[i] = rad.nextInt(100);
}
return array;
}
}
//正常循环迭代实现
public class InsertSort02
{
public static void main(String args[])
{
int A[] = {1,9,6,8,4,5,3,7,2,0};
for (int j= 0; j<A.length-1 ; j++)
{
int key =A[j+1] ;
int i= j;
//关键性插入
while ((i >= 0)&&(key< A[i]))
{
A[i+1] = A[i];
i--;
}
A[i+1] = key;
}
PrintArrays.printA(A);
}
}
//递归实现
public class InsertSort03
{
public static void main(String srgs[])
{
//产生随机数组
int A[] =RandomArray.randomArray(8);
insertSort(A, 0, A.length);
//输出数组
PrintArrays.printA(A);
}
//插入排序最后一个参数 r 为数组长度,p 为数组起始位置。
public static void insertSort(int []A,int p, int r)
{
// if 用于控制递归终止
if (r >p)
{
r--;
//递归拆解
insertSort(A ,p , r);
int i = r-1;
int key = A[r];
//位置插入关键
//边查找合适的插入位置,边挪动数组的元素
while (( i>=p) && (key <A[i]))
{
A[i+1] = A[i];
i--;
}
A[i+1] = key;
}
}
}
归并排序
//常规归并排序
public class MergeSort01
{
public static void main(String args[])
{
int A[] = RandomArray.randomArray(8);
mergeSort(A, 0, A.length-1);
//打印输出模块同上
PrintArrays.printA(A);
}
//归并排序(递归调用)
public static void mergeSort(int A[], int p, int r)
{
if ( r>p)
{
int q= (p+r-1)/2;
//方法形参传递 为值传递 ,数组形参传递的是引用地址
mergeSort(A, p, q);
mergeSort(A, q+1,r);
mergeArray(A, p, q, r);
}
}
//合并子问题的解 模块
public static void mergeArray(int A[] , int p,int q,int r)
{
int n1 = q - p + 1;
int n2 = r - q ;
int []L = new int[n1];
int []R = new int[n2];
for (int i =0; i< n1 ; i++)
{
L[i] = A[p+i];
}
for (int j =0; j< n1 ; j++)
{
R[j] = A[q+j+1];
}
for (int k= 0 ,i=0 ,j=0; ((i<n1) || (j<n2))&&(k< r-p+1) ; k++)
{
if (i>= n1)
{
A[p+k] = R[j];
j++;
} else if(j>= n2)
{
A[p+k] = L[i];
i++;
//以上是其中一个数组遍历完的处理
} else if ( L[i]< R[j])
{
A[p+k] = L[i];
i++;
} else{
A[p+k] = R[j];
j++;
}
}
}
}
//归并排序与插入排序结合
public class MergeSort02
{
public static void main(String args[])
{
//随机数组的产生
int A[] = RandomArray.randomArray(128);
PrintArrays.printA(A);
System.out.println();
mergeSort(A, 0, A.length-1, 4);
//输出
PrintArrays.printA(A);
}
//归并排序 参数说明:
// p 为数组起始位置 r 为数组末尾位置 nk 为子数组插入排序长度
public static void mergeSort(int A[], int p, int r, int nk)
{
int q= (p+r-1)/2;
if ((q-p+1) > nk)
{
//递归分解
mergeSort(A, p, q, nk);
mergeSort(A, q+1,r, nk);
}
else
{
//分治算法 解决最小的子问题
//插入排序最后一个参数为数组长度
InsertSort03.insertSort(A,p ,q +1);
InsertSort03.insertSort(A,q+1 ,r+1 );
}
MergeSort01.mergeArray(A, p, q, r);
//方法形参传递 为值传递 ,数组形参传递的是引用地址
//由于 数组传递引用地址的特性,解决了分治算法的合并子答案步骤
}
}
选择排序算法
//选择排序算法
public class SelectionAlgorithm01
{
public static void main(String args[])
{
int A[] = {1,9,6,8,4,5,3,7,2,0};
//选择算法
//变量 min 依次提取最小值
for ( int j=1 , k=0; j < A.length ; j++)
{
int min = A[j-1] ;
int i = j;
//变量 K 用于记录最小值的位置
while( i < A.length)
{
if( min >A[i])
{
min = A[i];
k = i;
}
i++;
}
A[k] = A[j-1];
A[j-1] = min;
}
// 4 重复
PrintArrays.printA(A);
}
}
冒泡排序
public class BubbleSort
{
//冒泡排序法
public void maoPaoPX(int[] arryA)
{
//将最大的依次 冒泡到最右边
for (var i=arryA.length; i>0;i--)
{
for (var j=0;j<i;j++)
{
if ((j+1)==arryA.length)
{
break;
}
if ( arryA[j] > arryA[j+1] )
{
int temp = arryA[j+1];
arryA[j+1] =arryA[j];
arryA[j] =temp;
}
}
}
}
}
查找算法
//查找算法
public class LinearSearch
{
static final int NIL = -1 ;
public static void main(String args[])
{
int v = 8;
int []A = {1,9,6,8,4,5,3,7,2,0};
//排序
A = InsertSort03.insertSort(A, A.length);
PrintArrays.printA(A);
System.out.println();
//线性查找
int j = linearSearch(A , v);
System.out.println("j = "+ j);
//二分法查找
j= binarySearch02(A , v, 1 ,A.length ,1 ) ;
System.out.println("j = "+ j);
/*
j= binarySearch(A , v , true , 0, A.length-1);
System.out.println("j = "+ j);
*/
}
//二分法查找
public static int binarySearch02(int []A,int v , int left,int right ,int mid)
{
mid = (left+ right)/2;
int aMid= mid -1;
if (A[aMid] == v)
{
return mid;
} else if( A[aMid] > v){
right = mid;
}else {
left = mid;
}
return binarySearch02(A , v ,left ,right ,mid);
}
//线性查找
public static int linearSearch(int []A, int v)
{
int i=1;
int j=NIL;
for (int atemp : A)
{
if( atemp == v)
{
j=i ;
}
i++;
}
return j;
}
}
习题 2.3.7
public class BookTest2o3o7
{
public static void main(String args[])
{
int A[] = {2 , 4, 5,6, 8, 10};
int x= 17;
System.out.println(bookTest2o3o7(A, x));
}
/*
描述一个运行时间为@(nlgn) 的算法,给定n 个整数的集合S 和另一个整数X , 该算法能
确定S 中是否存在两个元素其和刚好为x的元素。
*/
public static boolean bookTest2o3o7(int []A, int x)
{
if (A.length <=1)
{
return false;
}
int i=0;
int j= A.length-1;
while(i<j)
{
//x 与 A[i]+A[j] 比较。
//若 x 较大,则 i 增大 ,否则 j 减小,直到 i >= j 结束循环。
if (x ==(A[i] + A[j]) )
{
return true;
} else if( x > A[i] + A[j]){
i++;
} else {
j--;
}
}
return false;
}
}
第二章:排序算法 及其他 Java代码实现的更多相关文章
- 动画展现十大经典排序算法(附Java代码)
0.算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序. 非比较类排序: ...
- JAVA学习之Ecplise IDE 使用技巧(2)第二章:键盘小快手,代码辅助
上一篇:JAVA学习之Ecplise IDE 使用技巧(1)第一章:我的地盘我做主,工作空间 第二章:键盘小快手,代码辅助 内容包括: 第一:显示行号 如何设置行号:Ecplice菜单Windows& ...
- 八大排序算法总结与java实现(转)
八大排序算法总结与Java实现 原文链接: 八大排序算法总结与java实现 - iTimeTraveler 概述 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 ...
- 第23章 排序算法(包括merge等)
第23章 排序算法 Sorting:1 sort Sort elements in range (function template)2 stable_sort Sort elements pr ...
- 排序算法总结(基于Java实现)
前言 下面会讲到一些简单的排序算法(均基于java实现),并给出实现和效率分析. 使用的基类如下: 注意:抽象函数应为public的,我就不改代码了 public abstract class Sor ...
- 常见排序算法题(java版)
常见排序算法题(java版) //插入排序: package org.rut.util.algorithm.support; import org.rut.util.algorithm.Sor ...
- 排序算法大汇总 Java实现
一.插入类算法 排序算法的稳定性:两个大小相等的元素排序前后的相对位置不变.{31,32,2} 排序后{2,31,32},则称排序算法稳定 通用类: public class Common { pub ...
- 排序算法的总结——Java实现
前言 简单归纳一下最近学习的排序算法,如果有什么错误的地方还请大家指教. 本文介绍了七种经典排序算法,包括冒泡排序,选择排序,插入排序,希尔排序,归并排序,快速排序以及堆排序,并且讨论了各种算法的进一 ...
- 排序算法总结及Java实现
1. 整体介绍 分类 排序大的分类可以分为两种,内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.主要需要理解的都是内排序算法: 内排序可以分为 ...
随机推荐
- 用python绘制趋势图
import matplotlib.pyplot as plt #plt用于显示图片 import matplotlib.image as mping #mping用于读取图片 import date ...
- Mybatis多值传递的方式
一共有三种方式 1.参数传入Map 2参数使用@params 3.直接使用时用#{0},#{2} 参考网址 :https://www.2cto.com/database/201409/338155.h ...
- Hibernate系列1:入门程序
1.传统的java数据库连接 在传统的开发中,如果要建立java程序和数据库的连接,通常采用JDBC或者Apache Commons DbUtils开发包来完成.他们分别有以下特点: JDBC: 优点 ...
- where in 的参数化查询实现
身为一名小小的程序猿,在日常开发中不可以避免的要和where in和like打交道,在大多数情况下我们传的参数不多简单做下单引号.敏感字符转义之后就直接拼进了SQL,执行查询,搞定.若有一天你不可避免 ...
- 后端脚手架搭建--SSM(一)开篇
一.絮叨 一直在计划自己搭建一个后台的管理系统脚手架,也已经开始着手做了,但是做的过程中一直出现混乱的状态.在前端技术选型的时候觉得Vue不错,然后去学了一段时间的Vue,准备拿来在项目里面用.然后又 ...
- 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_1 搭建环境
创建项目 使用骨架,创建webapp 为了创建项目更快速maven设置 archetypeCatalog internal 修改编译的版本 从昨天的课程内复制 相关的坐标.上面是版本锁定. 复制前端的 ...
- 阶段3 3.SpringMVC·_03.SpringMVC常用注解_3 PathVariable注解
请求地址都一样,根据不同的请求方式,最终让不同的方法去执行.这就是restfull的风格 如果有两个查询都是get的.那么当前访问 满足条件的就是两个. 用一个占位符 {id} 演示PathVaria ...
- 关于bootstrap按钮的偏移
<body> <div id="divForm" class="addView"> <div class="form-h ...
- centos 7 删除 virbr0 虚拟网卡
出现虚拟网卡是因为安装时启用了 libvirtd 服务后生成的关闭方法virsh net-list名称 状态 自动开始 持久------------------- ...
- C# 跨线程更新 UI
Winforms 跨线程更新 UI 在 Winforms 中, 所有的控件都包含 InvokeRequired 属性, 如果我们要更新UI,通过它我们可以判断是否需要调用 [Begin]Invoke. ...