《算法》第二章部分程序 part 1
▶ 书中第二章部分程序,加上自己补充的代码,包括插入排序,选择排序,Shell 排序
● 插入排序
package package01; import java.util.Comparator;
import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut; public class class01
{
private class01() { } public static void sort(Comparable[] a) // 插入排序
{
int n = a.length;
for (int i = 0; i < n; i++)
{
for (int j = i; j > 0 && less(a[j], a[j - 1]); j--)
{
exch(a, j, j - 1);
}
//assert isSorted(a, 0, i); // 检验是否正确排序
}
//assert isSorted(a);
} public static void sort(Comparable[] a, int lo, int hi) // 部分插入排序
{
for (int i = lo; i < hi; i++)
{
for (int j = i; j > lo && less(a[j], a[j - 1]); j--)
{
exch(a, j, j - 1);
}
}
//assert isSorted(a, lo, hi);
} public static void sort(Object[] a, Comparator comparator) // 自定义比较运算的插入排序
{
int n = a.length;
for (int i = 0; i < n; i++)
{
for (int j = i; j > 0 && less(a[j], a[j - 1], comparator); j--)
{
exch(a, j, j - 1);
}
//assert isSorted(a, 0, i, comparator);
}
//assert isSorted(a, comparator);
} public static void sort(Object[] a, int lo, int hi, Comparator comparator) // 自定义比较运算的部分插入排序
{
for (int i = lo; i < hi; i++)
{
for (int j = i; j > lo && less(a[j], a[j - 1], comparator); j--)
{
exch(a, j, j - 1);
}
}
//assert isSorted(a, lo, hi, comparator);
} public static void sort2(Comparable[] a) // 改良版本,不使用逐两元交换,而是位移 - 赋值方法
{
int n = a.length;
boolean exchanges = false;
for (int i = n - 1; i > 0; i--) // 倒着扫描一遍,将最小元素放到开头,并统计倒序
{
if (less(a[i], a[i - 1]))
{
exch(a, i, i - 1);
exchanges = true;
}
}
if (exchanges == false) // 如果没有交换,说明已经排好序了
return; for (int i = 2; i < n; i++) // 正常的排序,从第 3 元素开始
{
Comparable v = a[i];
int j = i;
for (; less(v, a[j - 1]); j--)
a[j] = a[j - 1];
a[j] = v;
}
//assert isSorted(a);
} public static void sort3(Comparable[] a) // 改良版本,使用二分搜索寻找插入位置,减少判断次数
{
int n = a.length;
for (int i = 1; i < n; i++)
{
Comparable v = a[i];
int lo = 0, hi = i;
for (; lo < hi;)
{
int mid = lo + (hi - lo) / 2;
if (less(v, a[mid])) // 左边强调整,右边弱调整
hi = mid;
else
lo = mid + 1;
} for (int j = i; j > lo; --j) // 用前面的位移 - 赋值方法
a[j] = a[j - 1];
a[lo] = v;
}
//assert isSorted(a);
} public static int[] indexSort(Comparable[] a) // 给定数组 a 及其排序后的数组 a',对于任意 0 ≤ i ≤ a.length - 1,
{ // a'[i] == a[index[i]],即 a 排序后第 i 位的值可用 a 和 index 来查找
int n = a.length;
int[] index = new int[n];
for (int i = 0; i < n; i++)
index[i] = i; for (int i = 0; i < n; i++)
for (int j = i; j > 0 && less(a[index[j]], a[index[j - 1]]); j--)
exch(index, j, j - 1);
return index;
} private static boolean less(Comparable v, Comparable w) // v < w ?
{
return v.compareTo(w) < 0;
} private static boolean less(Object v, Object w, Comparator comparator) // v < w ?
{
return comparator.compare(v, w) < 0;
} private static void exch(Object[] a, int i, int j) // 交换
{
Object swap = a[i];
a[i] = a[j];
a[j] = swap;
} private static void exch(int[] a, int i, int j) // 间接交换,用于 indexSort
{
int swap = a[i];
a[i] = a[j];
a[j] = swap;
} // 检验是否完成排序的辅助函数,4 个
private static boolean isSorted(Comparable[] a)
{
return isSorted(a, 0, a.length);
} private static boolean isSorted(Comparable[] a, int lo, int hi)
{
for (int i = lo + 1; i < hi; i++)
{
if (less(a[i], a[i - 1]))
return false;
}
return true;
} private static boolean isSorted(Object[] a, Comparator comparator)
{
return isSorted(a, 0, a.length, comparator);
} private static boolean isSorted(Object[] a, int lo, int hi, Comparator comparator)
{
for (int i = lo + 1; i < hi; i++)
{
if (less(a[i], a[i - 1], comparator))
return false;
}
return true;
} private static void show(Comparable[] a) // 输出结果
{
for (int i = 0; i < a.length; i++)
StdOut.println(a[i]);
} public static void main(String[] args)
{
String[] a = StdIn.readAllStrings();
int[] index = class01.indexSort(a); class01.sort(a); show(a);
for (int i = 0; i<a.length; i++)
StdOut.println(index[i]);
}
}
● 选择排序,结构类似前面的插入排序,删掉了检查等辅助函数
package package01; import java.util.Comparator;
import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut; public class class01
{
private class01() {} public static void sort(Comparable[] a)
{
int n = a.length;
for (int i = 0; i < n; i++)
{
int min = i;
for (int j = i + 1; j < n; j++)
{
if (less(a[j], a[min]))
min = j;
}
exch(a, i, min);
}
} public static void sort(Object[] a, Comparator comparator)
{
int n = a.length;
for (int i = 0; i < n; i++)
{
int min = i;
for (int j = i + 1; j < n; j++)
{
if (less(a[j], a[min], comparator))
min = j;
}
exch(a, i, min);
}
} private static boolean less(Comparable v, Comparable w)
{
return v.compareTo(w) < 0;
} private static boolean less(Object v, Object w, Comparator comparator)
{
return comparator.compare(v, w) < 0;
} private static void exch(Object[] a, int i, int j)
{
Object swap = a[i];
a[i] = a[j];
a[j] = swap;
} private static void show(Comparable[] a)
{
for (int i = 0; i < a.length; i++)
StdOut.println(a[i]);
} public static void main(String[] args)
{
String[] a = StdIn.readAllStrings(); class01.sort(a); show(a);
}
}
● Shell 排序
package package01; import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut; public class class01
{
private class01() {} public static void sort(Comparable[] a)
{
int n = a.length, h = 1;
for (; h < n / 3; h = 3 * h + 1); // a[n+1] = 3 * a[n] + 1 : 1, 4, 13, 40, 121, 364, 1093, ...
for (; h >= 1; h /= 3) // 使用 h 递增序列来逐步排序
{
for (int i = h; i < n; i++)
{
for (int j = i; j >= h && less(a[j], a[j - h]); j -= h)
exch(a, j, j - h);
}
//assert isHsorted(a, h);
}
//assert isSorted(a);
} private static boolean less(Comparable v, Comparable w)
{
return v.compareTo(w) < 0;
} private static void exch(Object[] a, int i, int j)
{
Object swap = a[i];
a[i] = a[j];
a[j] = swap;
} private static boolean isHsorted(Comparable[] a, int h) // 检查函数与前面不同,保留
{
for (int i = h; i < a.length; i++)
{
if (less(a[i], a[i - h]))
return false;
}
return true;
} private static boolean isSorted(Comparable[] a)
{
for (int i = 1; i < a.length; i++)
if (less(a[i], a[i - 1])) return false;
return true;
} private static void show(Comparable[] a)
{
for (int i = 0; i < a.length; i++)
StdOut.println(a[i]);
} public static void main(String[] args)
{
String[] a = StdIn.readAllStrings(); class01.sort(a); show(a);
}
}
《算法》第二章部分程序 part 1的更多相关文章
- 《算法》第二章部分程序 part 5
▶ 书中第二章部分程序,加上自己补充的代码,包括利用优先队列进行多路归并和堆排序 ● 利用优先队列进行多路归并 package package01; import edu.princeton.cs.a ...
- 《算法》第二章部分程序 part 4
▶ 书中第二章部分程序,加上自己补充的代码,包括优先队列和索引优先队列 ● 优先队列 package package01; import java.util.Comparator; import ja ...
- 《算法》第二章部分程序 part 3
▶ 书中第二章部分程序,加上自己补充的代码,包括各种优化的快排 package package01; import edu.princeton.cs.algs4.In; import edu.prin ...
- 《算法》第二章部分程序 part 2
▶ 书中第二章部分程序,加上自己补充的代码,包括若干种归并排序,以及利用归并排序计算数组逆序数 ● 归并排序 package package01; import java.util.Comparato ...
- javascript数据结构和算法 第二章 (数组) 二
字符串表示的数组 join() 和 toString() 函数返回数组的字符串表示.这两个函数通过将数组中的元素用逗号分隔符切割,返回字符串数组表示. 这里有个样例: var names = [&qu ...
- 第二章--Win32程序运行原理 (部分概念及代码讲解)
学习<Windows程序设计>记录 概念贴士: 1. 每个进程都有赋予它自己的私有地址空间.当进程内的线程运行时,该线程仅仅能够访问属于它的进程的内存,而属于其他进程的内存被屏蔽了起来,不 ...
- java版数据结构与算法第二章数组
数组由一组具有相同类型的数据元素组成,并存储在一组连续存储单元中.一维数组是常量. 二维数组:若一维数组中的数据元素又是一堆数据结构,我们称之为二维数组.二维数组可以看成是n个列向量组成的线性表. 数 ...
- ASP.NET本质论第二章应用程序对象学习笔记1
1.请求的处理参数—上下文对象HttpContext 1) 针对每一次请求,ASP.NET将创建一个处理这次请求所使用的HttpContext对象实例,这个对象实例将用来在ASP.NET服务器的处理过 ...
- 【学习总结】java数据结构和算法-第二章-数据结构和算法概述
总目录链接 [学习总结]尚硅谷2019java数据结构和算法 github:javaDSA 目录 数据结构和算法的关系 几个实际编程中的问题 线性结构和非线性结构 数据结构和算法的关系 几个实际编程中 ...
随机推荐
- spring 基本配置学习
1.bean的方式说明 作用: 用于配置对象让spring来创建的. 默认情况下它调用的是类中的无参构造函数.如果没有无参构造函数则不能创建成功. 属性: id:给对象在容器中提供一个唯一标识. ...
- 在Python中进行自动化单元测试的教程
From: https://www.jb51.net/article/64119.htm 一.软件测试 大型软件系统的开发是一个很复杂的过程,其中因为人的因素而所产生的错误非常多,因此软件在开发过程必 ...
- C++进阶--类的继承
//############################################################################ /* * 公有,保护,私有继承 */ cl ...
- centos7系列-给普通用户sudo权限
对于linux用户来讲,普通用户的权限是有一定限制的,所以在有些操作的时候,是需要sudo权限的,那么如何在linux下赋予普通用户sudo权限呢?此处将讲解一下方法. 在login我们的系统后,如果 ...
- go get golang.org/x 包失败解决方法
由于墙的原因,国内使用 go get安装golang 官方包可能会失败 解决方法 方法1 [不需要FQ] Win10下相关配置: GOPATH : E:\go 安装记录: E:\>go get ...
- java高并发编程(三)
java高并发主要有三块知识点: synchronizer:同步器,在多个线程之间互相之间怎么进行通讯,同步等: 同步容器:jdk提供了同步性的容器,比如concurrentMap,concurren ...
- 修改最后一次 已commit 的备注
输入命令 git commit --amend 会展示出最后一次提交的 备注信息 按 i 进行编辑 按esc 退出编辑 再按 shift +: (注意是英文的冒号),切换到命令行 wq 保存 即可 参 ...
- Springboot监控之一:SpringBoot四大神器之Actuator之2--覆盖修改spring cloud的默认的consul健康检查规则
微服务网关是socket长连接与支付公司对接,该网关需要提供http接口给内部系统调用,当socket没有建立连接时(网关服务的高可用是haProxy搭建的,有些服务的socket可能未连上支付公司) ...
- springboot(五)读写分离,多个读库,Druid监控--待整理
1.修改mybatis.properties # 主数据源,默认的 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.d ...
- K近邻(K Nearest Neighbor-KNN)原理讲解及实现
算法原理 K最近邻(k-Nearest Neighbor)算法是比较简单的机器学习算法.它采用测量不同特征值之间的距离方法进行分类.它的思想很简单:如果一个样本在特征空间中的k个最近邻(最相似)的样本 ...