▶ 书中第二章部分程序,加上自己补充的代码,包括插入排序,选择排序,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的更多相关文章

  1. 《算法》第二章部分程序 part 5

    ▶ 书中第二章部分程序,加上自己补充的代码,包括利用优先队列进行多路归并和堆排序 ● 利用优先队列进行多路归并 package package01; import edu.princeton.cs.a ...

  2. 《算法》第二章部分程序 part 4

    ▶ 书中第二章部分程序,加上自己补充的代码,包括优先队列和索引优先队列 ● 优先队列 package package01; import java.util.Comparator; import ja ...

  3. 《算法》第二章部分程序 part 3

    ▶ 书中第二章部分程序,加上自己补充的代码,包括各种优化的快排 package package01; import edu.princeton.cs.algs4.In; import edu.prin ...

  4. 《算法》第二章部分程序 part 2

    ▶ 书中第二章部分程序,加上自己补充的代码,包括若干种归并排序,以及利用归并排序计算数组逆序数 ● 归并排序 package package01; import java.util.Comparato ...

  5. javascript数据结构和算法 第二章 (数组) 二

    字符串表示的数组 join() 和 toString() 函数返回数组的字符串表示.这两个函数通过将数组中的元素用逗号分隔符切割,返回字符串数组表示. 这里有个样例: var names = [&qu ...

  6. 第二章--Win32程序运行原理 (部分概念及代码讲解)

    学习<Windows程序设计>记录 概念贴士: 1. 每个进程都有赋予它自己的私有地址空间.当进程内的线程运行时,该线程仅仅能够访问属于它的进程的内存,而属于其他进程的内存被屏蔽了起来,不 ...

  7. java版数据结构与算法第二章数组

    数组由一组具有相同类型的数据元素组成,并存储在一组连续存储单元中.一维数组是常量. 二维数组:若一维数组中的数据元素又是一堆数据结构,我们称之为二维数组.二维数组可以看成是n个列向量组成的线性表. 数 ...

  8. ASP.NET本质论第二章应用程序对象学习笔记1

    1.请求的处理参数—上下文对象HttpContext 1) 针对每一次请求,ASP.NET将创建一个处理这次请求所使用的HttpContext对象实例,这个对象实例将用来在ASP.NET服务器的处理过 ...

  9. 【学习总结】java数据结构和算法-第二章-数据结构和算法概述

    总目录链接 [学习总结]尚硅谷2019java数据结构和算法 github:javaDSA 目录 数据结构和算法的关系 几个实际编程中的问题 线性结构和非线性结构 数据结构和算法的关系 几个实际编程中 ...

随机推荐

  1. Windows Azure Web Site (18) Azure Web App设置MIME

    <Windows Azure Platform 系列文章目录> 在笔者之前的文章中,介绍了我们在使用Azure Web App,可以把静态资源保存到Azure Storage中: Wind ...

  2. 关于JFame 屏幕居中显示的问题

    场景:    在利用 JAVA  的 Swing 开发 C/S 架构 的前端界面 目的:    想让 JFrame 居中显示在整个 屏幕的正中位置 方法一:JFrame frame = new JFr ...

  3. node.js 学习的一个链接

    Node.js简介 点击查看 狼叔 的

  4. 服务容错保护断路器Hystrix之四:断路器监控(Hystrix Dashboard)-turbine集群监控

    turbine 英[ˈtɜ:baɪn] n. 汽轮机; 涡轮机; 透平机; OK,上文我们看了一个监控单体应用的例子,在实际应用中,我们要监控的应用往往是一个集群,这个时候我们就得采取Turbine集 ...

  5. Java-学习-喜欢-品牌:互联网公司成为动物园,拟人化品牌形象真的那么有意思?

    ylbtech-Java-学习-喜欢-品牌:互联网公司成为动物园,拟人化品牌形象真的那么有意思?  1.返回顶部 1. 当我们在思考如何在这个碎片化.多元化的时代找到真实的.不被标签的自我时,互联网中 ...

  6. Tomcat7启动分析(三)Digester的使用(转载)

    原文 http://tyrion.iteye.com/blog/1912290 前一篇文章里最后看到Bootstrap的main方法最后会调用org.apache.catalina.startup.C ...

  7. 敏捷软件开发——第8章 SRP:单一职责原则

    第8章 SRP:单一职责原则 一个类应该只有一个发生变化的原因. 8.1 定义职责 在SRP中我们把职责定义为变化的原因.如果你想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责.同时,我 ...

  8. [UE4]扔枪

    1.把枪Detach掉:DetachFromActor 3个都选择“Keep World” 2.模拟物理 3.给一个向前的速度 4.切枪,到上一个武器,或者捡起脚底下的武器 注意Get Compone ...

  9. [UE4]条件语句Select

    select接收3个参数,输出一个值. 当条件为true时,返回输入到True节点的值. 当条件为false时,返回输入到false节点的值. select的输入和输出参数也可以是整数.float.V ...

  10. Linux 防火墙和SELinux的开启和关闭

    防火墙(firewalld) 临时关闭防火墙 systemctl stop firewalld 永久防火墙开机自关闭 systemctl disable firewalld 临时打开防火墙 syste ...