第二章:排序算法 及其他 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代码实现的更多相关文章

  1. 动画展现十大经典排序算法(附Java代码)

    0.算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序. 非比较类排序: ...

  2. JAVA学习之Ecplise IDE 使用技巧(2)第二章:键盘小快手,代码辅助

    上一篇:JAVA学习之Ecplise IDE 使用技巧(1)第一章:我的地盘我做主,工作空间 第二章:键盘小快手,代码辅助 内容包括: 第一:显示行号 如何设置行号:Ecplice菜单Windows& ...

  3. 八大排序算法总结与java实现(转)

    八大排序算法总结与Java实现 原文链接: 八大排序算法总结与java实现 - iTimeTraveler 概述 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 ...

  4. 第23章 排序算法(包括merge等)

      第23章 排序算法  Sorting:1 sort Sort elements in range (function template)2 stable_sort Sort elements pr ...

  5. 排序算法总结(基于Java实现)

    前言 下面会讲到一些简单的排序算法(均基于java实现),并给出实现和效率分析. 使用的基类如下: 注意:抽象函数应为public的,我就不改代码了 public abstract class Sor ...

  6. 常见排序算法题(java版)

    常见排序算法题(java版) //插入排序:   package org.rut.util.algorithm.support;   import org.rut.util.algorithm.Sor ...

  7. 排序算法大汇总 Java实现

    一.插入类算法 排序算法的稳定性:两个大小相等的元素排序前后的相对位置不变.{31,32,2} 排序后{2,31,32},则称排序算法稳定 通用类: public class Common { pub ...

  8. 排序算法的总结——Java实现

    前言 简单归纳一下最近学习的排序算法,如果有什么错误的地方还请大家指教. 本文介绍了七种经典排序算法,包括冒泡排序,选择排序,插入排序,希尔排序,归并排序,快速排序以及堆排序,并且讨论了各种算法的进一 ...

  9. 排序算法总结及Java实现

    1. 整体介绍 分类 排序大的分类可以分为两种,内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.主要需要理解的都是内排序算法: 内排序可以分为 ...

随机推荐

  1. react 脚手架 及路由和 redux

    前提是我们需要下载 nodejs 使用 npm 下载 react 的脚手架,react-router-dom,redux 全局下载 react 的脚手架:npm i create-react-app ...

  2. Selenium chromeDriver 下载地址

    http://chromedriver.storage.googleapis.com/ http://npm.taobao.org/mirrors/chromedriver/

  3. ftp列出具体目录的所有目录,和目录按照文件类型列出

    package com.haiyisoft.cAssistantWeb.util; import java.io.IOException; import java.io.PrintWriter; im ...

  4. a标签的伪类

    a 超链接 伪类:给元素添加特殊的效果 :link 未访问过的链接初始颜色 :visited 访问过后的链接颜色 :hover 鼠标移入(悬停)时的颜色 :active 鼠标按下时链接的颜色 书写时的 ...

  5. 转贴 使用正则表达式解析一般sql语句(C++)

    https://blog.csdn.net/dreamgchuan/article/details/47715743 --END--2019年9月5日11点58分

  6. js图片轮播效果实现代码

    首先给大家看一看js图片轮播效果,如下图 具体思路: 一.页面加载.获取整个容器.所有放数字索引的li及放图片列表的ul.定义放定时器的变量.存放当前索引的变量index 二.添加定时器,每隔2秒钟i ...

  7. Angularjs E2E test Report/CoverageReport - 使用Gulp

    上一篇(http://www.cnblogs.com/xiaoningz/p/7122633.html)使用grunt-protractor-coverage 做为覆盖率测试插件,如果项目的管理工具刚 ...

  8. vs在微软官方tfs创建私有项目过程

    谁也不是成天创建新项目,每次一创建就跟没干过这活似的,这次把它记下,再用的时候来翻,也希望能给别人点帮助. 上https://dev.azure.com/,tfs原来的网址会往这里跳,现在都在往dev ...

  9. Tomcat远程调试参数

    Linux: 关闭防火墙 vim catalina.sh export CATALINA_OPTS="-server -Xdebug -Xnoagent -Djava.compiler=NO ...

  10. 修改node节点名称

    https://my.oschina.net/u/3390908/blog/1649764 .查看原来node [root@lab2 ~]# kubectl get no NAME STATUS RO ...