第二章:排序算法 及其他 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. 整体介绍 分类 排序大的分类可以分为两种,内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.主要需要理解的都是内排序算法: 内排序可以分为 ...
随机推荐
- LeetCode 136. 只出现一次的数字(Single Number)
题目描述 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: ...
- 在ubuntu16.04-32bits 下编译vlc和vlc-qt开源项目
软件版本: Ubuntu14.04 32位 Qt5.4.0 32位 开源项目: vlc2.2.4: wget http://download.videolan.org/pub/v ...
- The remote system refused the connection.
使用SecureCRT连接Ubuntu时,报错: The remote system refused the connection. 说明Ubuntu上没有安装openssh-server,使用命令: ...
- ping包的checksum校验和
PING包发送里面有一个比较关键的就是checksum即校验和 checksum本来就是ICMP包内的数据 怎么又从ICMP包开始计算?后来看了一下文档,就是就算ICMP的时候checksum本身 的 ...
- echo、print、print_r之间的区别
echo php语句:可以一次输出多个值,多个值之间用逗号隔开:没有返回值,输出标量的值.print 函数:只能打印简单类型变量的值(标量,如int,string),返回值为布尔型print_r 函数 ...
- ipv4 ipv6 求字符串和整数一一映射的算法 AmazonOrderId
字符串和整数一一映射的算法 公司每人的英文名不同,现在给每个英文名一个不同的数字编号,怎么设计? 走ipv4/6 2/32 2/128就够了,把“网段”概念对应到“表或库”,ip有a_e5类,这概念 ...
- TensorFlow 学习(4)——MNIST机器学习进阶
要进一步改进MNIST学习算法,需要对卷积神经网络进行学习和了解 学习材料参见https://www.cnblogs.com/skyfsm/p/6790245.html 卷积神经网络依旧是层级网络,只 ...
- LC 660. Remove 9 【lock, hard】
Start from integer 1, remove any integer that contains 9 such as 9, 19, 29... So now, you will have ...
- RNN 与 LSTM 的原理详解
原文地址:https://blog.csdn.net/happyrocking/article/details/83657993 RNN(Recurrent Neural Network)是一类用于处 ...
- JMeter4.0分布式调度压测部署
我们在Loadrunner学过使用Load Generator做肉鸡, 通过Controller来进行脚本和权重的分配来进行分布式压测, Jmeter作为当今的网红性能测试工具,这个功能必须是少不了的 ...