《算法》第二章部分程序 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 目录 数据结构和算法的关系 几个实际编程中的问题 线性结构和非线性结构 数据结构和算法的关系 几个实际编程中 ...
随机推荐
- Configure Virtual Serial Port Driver (vspd)注册表
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VSBC7\Ports\COM3COM4] “Port1”=”COM3” “Port2”=” ...
- linux 内存映射-ioremap和mmap函数
最近开始学习Linux驱动程序,将内存映射和ioremap,mmap函数相关资料进行了整理 一,内存映射 对于提供了MMU(存储管理器,辅助操作系统进行内存管理,提供虚实地址转换等硬件支持)的处理器 ...
- 持续集成(Continuous Integration)基本概念与实践
本文由Markdown语法编辑器编辑完成. From https://blog.csdn.net/inter_peng/article/details/53131831 1. 持续集成的概念 持续集成 ...
- 【JVM参数】Java启动时,显示class是从哪个Jar中加载的
显示具体的Class是从哪个Jar文件加载 JVM参数: -verbose:class 启动后输出如下: [Opened D:\Program Files\Java\jdk1.8.0_131\jre\ ...
- Python利用Plotly实现对MySQL中的数据可视化
Mysql表数据: demo.sql内容 create table demo( id int ,product varchar(50) ,price decimal(18,2) ,quantity i ...
- U3d 注意
设置layer :不要使用go.layer= intMM;要使用Nguitool.Setlayer(go,intLayer); static public void SetLayer (GameObj ...
- 【IIS错误 - HTTP 错误 500.19】HTTP 错误 500.19- Internal Server Error 错误解决方法(一)
刚在本机部署了一个WebService测试,浏览的时候出现了“HTTP 错误 500.19 - Internal Server Error ”错误,如下图: 经过检查发现是由于先安装vs2008后安装 ...
- requests 请求几个接口 出现’您的账户在其它设备使用过,为保障安全,需重新登入才能在本设备使用‘
因为接口和接口直接有个字段是关联的 在登陆请求后,后台响应了个token,下面的请求 ,请求头要带上这个token 才认为是登陆后 的操作
- ubuntu的一些常用命令及疑难杂症
记录ubuntu下各种注意事项及常用命令 1,发热:因为硬件厂商对linux类系统的支持不足,驱动不会自动安装,所以要自己装... http://www.linuxidc.com/Linux/2015 ...
- Schiff Move Free维骨力这个牌子的保健效果怎么样,是要给中老年人群服用的
Schiff Move Free维骨力这个牌子的保健效果怎么样,是要给中老年人群服用的.? https://www.zhihu.com/question/46399868 服move free还要补钙 ...