▶ 书中第二章部分程序,加上自己补充的代码,包括插入排序,选择排序,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. 错误 Run-time error nnn at xxxx; 错误

      出现runtime error临时解决办法,于注册表位置中找到如下键值HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Gdiplus,然后把键DisableTIFFCo ...

  2. mysql数据字典 如何生成?

    用phpMyAdmin查看表结构,点击 打印预览. &amp;lt;img src="https://pic3.zhimg.com/50/3205ff3bd3da067528f4c1 ...

  3. Linux环境下查看线程数的几种方法

    1.cat /proc/${pid}/status 2.pstree -p ${pid} 3.top -p ${pid} 再按H,或者直接输入 top -bH -d 3 -p  ${pid} top ...

  4. C#实现mongodb自增列的使用

    创建一个集合存放_id db.createCollection("counters") 加入需要自增的字段 { "_id":"productid&qu ...

  5. erlang 安装

    [root@Aliyun software]# rpm -Uvh erlang-solutions-1.0.1.noarch.rpm [root@Aliyun software]# yum -y in ...

  6. [ZZ]39条更好的软件开发方法

    1.重构是程序员的主力技能. 2.工作日志能提升脑容量. 3.先用profiler调查,才有脸谈优化. 4.注释贵精不贵多.杜绝大姨妈般的“例注”.漫山遍野的碎碎念注释,实际就是背景噪音. 5.普通程 ...

  7. IP地址基础

    第一台计算机的名字   1946年2月14日,世界上第一台电脑ENIAC在美国宾夕法尼亚大学诞生,名叫ENIAC(爱尼阿克). 第一个网络的名字: arpanet 计算机网络定义: 物理位置不同.功能 ...

  8. intent--Activity之间数据传递之Intent数据传递

    intent传值: 4,intent传集合 3,intent传对象, 2,传递后有返回值的情况:当需要从目标Activity回传数据到原Activity时,可以使用上述方法定义一个新的Intent来传 ...

  9. Replicating a 2D dynamic array

    转自:https://forums.unrealengine.com/community/community-content-tools-and-tutorials/105-saxonrahs-tut ...

  10. 高通平台读写nv总结

    一,引言      1. 什么是NV       高通平台的NV,保存了系统运行过程中各个模块可能用到的一些参数值,它是以单个文件的形式保存在EFS中,但用户是不能随意访问的,只能通过QXDM来进行读 ...