▶ 书中第二章部分程序,加上自己补充的代码,包括插入排序,选择排序,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. CentOS 7.4 初次手记:第三章 CentOS基础了解

    第三章 CentOS基础了解... 36 第一节 语言编码.终端... 36 I 查看语言编码... 36 II Tty?.pts/?. 36 第二节 bash/sh command. 38 I 查找 ...

  2. 我的Netty笔记

    pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w ...

  3. 【剑指offer】两个栈实现队列

    用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. public class Solution {        Stack<Integer> stack ...

  4. vc++使用cookie登录网站

    以http://www.idc816.com为例 效果图: 1)先登录获取cookie,再使用cookie获取用户信息 2)记录cookie,关闭程序后重新运行程序,直接获取用户信息 使用Fiddle ...

  5. Mina2 udp--zhengli

    一.包与类名. 1.所有类和方法严格使用驼峰法命名.例:SSLFilter 更名为 SslFilter.NIO传输类在命名时增加 Nio 前缀.因为NIO 并不是 socket/datagram 传输 ...

  6. 配置允许匿名用户登录访问vsftpd服务,进行文档的上传下载、文档的新建删除等操作

    centos7环境下 临时关闭防火墙 #systemctl stop firewalld 临时关闭selinux #setenforce 0 安装ftp服务 #yum install vsftpd - ...

  7. 二进制编译安装httpd服务

    systemctl stop httpd yum remove httpd-----------------------(在做之前 先删掉httpd) 安装编译环境 yum -y groupinsta ...

  8. Jmeter(四)NO-GUI模式运行

    在前几篇中有提到NO-GUI模式的运行,是的,Jmeter支持NO-GUI方式的运行. 如果Jmeter的环境搭建完毕,那么在命令行下执行jmeter - ?便会出现jmeter的各个参数 --? p ...

  9. [UE4]认识CanvasPanelSlot,Construct Object From Class动态创建UI控件

    Canvas Panel Slot是UserWidget的Canvas Panel组件容器内的组件特有的属性. 只有放置在Canvas Panel容器内才会有Canvas Panel Slot属性 可 ...

  10. 通过创建临时表合并某一个库的hive小文件

    #!/bin/bash #需要指定hive中的库名 #set -x set -e DB=$1 if [ -z $1 ];then echo "Usage:$0 DbName" ex ...