《Algorithms算法》元素排序(1)——简单排序


1.排序问题

排序问题在日常生活中非常常见,例如最简单的,学生名单,就有多种排序,名字,成绩,号码,宿舍号……

问题是,我们如何对多种类型进行排序?

  • 答案是——回调函数。

它的实现思路很简单: 我们调用系统的sort函数,系统根据需要通过回调对象的CompareTo函数,对特定的对象进行排序。

1.1 回调函数

在不同的语言中,有不同的实现回调函数的方式,其中java使用的是Interfaces

1.2Java中回调函数的路线图

1.3 全序

设集合X上有一全序关系,如果我们把这种关系用 ≤ 表述,则下列陈述对于 X 中的所有 a, b 和 c 成立:

  • 如果 a≤b 且 b≤a 则 a=b (反对称性)
  • 如果 a≤b 且 b≤c 则 a≤c (传递性)
  • a≤b 或 b≤a (完全性)

注意: double 的 ≤ 不是全序

1.4 Comparable API

1.4.1 实现原则

  • 必须是全序
  • 小于,等于,大于分别返回负数(-1),0, 正数(1)
  • 对于不兼容的类型,抛出异常

1.4.2 例子

2个比较有用的排序抽象 :

  • 小于
  • 交换

这两个功能在排序上用处很多

2.选择排序

2.1选择排序思想(动画)

选择排序是很简单的思想:
选择最小的和第一个数交换,第二小的的跟第二个数交换……

2.2选择排序的内部循环不变性

2.3选择排序代码

public class Selection
{
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);
}
}
private static boolean less(Comparable v, Comparable w)
{
/* as before */
}
private static void exch(Comparable[] a, int i, int j)
{
/* as before */
}
}

3.插入排序

3.1插入排序思想(动画)

插入排序算法思想也很简单:
每来一个数,把他插入到前面对应的位置,使得前面一直有序

3.2插入排序的内部循环不变性

3.3插入排序代码

public class Insertion
{
public static void sort(Comparable[] a)
{
int N = a.length;
for (int i = 0; i < N; i++)
for (int j = i; j > 0; j--)
if (less(a[j], a[j-1]))
exch(a, j, j-1);
else break;
}
private static boolean less(Comparable v, Comparable w)
{
/* as before */
}
private static void exch(Comparable[] a, int i, int j)
{
/* as before */
}
}

3.4 插入排序分析

插入排序最好的情况是比较N-1次0次交换,最坏的情况要N22次比较和N22次交换

插入排序对于部分有序的数组效率挺高的,特别是对于小数组

《Algorithms算法》笔记:元素排序(1)——简单排序的更多相关文章

  1. 算法笔记(c++)--桶排序题目

    算法笔记(c++)--桶排序 记得题目是排序,输入n个1-1000的数字然后去重然后排序. 桶排序没毛病 #include<iostream> using namespace std; i ...

  2. C#实现(递归和非递归)高速排序和简单排序等一系列排序算法

        本人由于近期工作用到了一些排序算法.就把几个简单的排序算法.想冒泡排序,选择排序,插入排序.奇偶排序和高速排序等整理了出来,代码用C#代码实现,而且通过了測试.希望能给大家提供參考.     ...

  3. 算法笔记_221:串的简单处理(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 串的处理在实际的开发工作中,对字符串的处理是最常见的编程任务.本题目即是要求程序对用户输入的串进行处理.具体规则如下:1. 把每个单词的首字母变为大 ...

  4. 《Algorithms算法》笔记:元素排序(3)——洗牌算法

    <Algorithms算法>笔记:元素排序(3)——洗牌算法 Algorithms算法笔记元素排序3洗牌算法 洗牌算法 排序洗牌 Knuth洗牌 Knuth洗牌代码 洗牌算法 洗牌的思想很 ...

  5. 《Algorithms算法》笔记:元素排序(4)——凸包问题

    <Algorithms算法>笔记:元素排序(4)——凸包问题 Algorithms算法笔记元素排序4凸包问题 凸包问题 凸包问题的应用 凸包的几何性质 Graham 扫描算法 代码 凸包问 ...

  6. 《Algorithm算法》笔记:元素排序(2)——希尔排序

    <Algorithm算法>笔记:元素排序(2)——希尔排序 Algorithm算法笔记元素排序2希尔排序 希尔排序思想 为什么是插入排序 h的确定方法 希尔排序的特点 代码 有关排序的介绍 ...

  7. Java数据结构和算法 - 简单排序

    Q: 冒泡排序? A: 1) 比较相邻的元素.如果第一个比第二个大,就交换它们两个; 2) 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数; 3) 针 ...

  8. 数据结构与算法之--高级排序:shell排序和快速排序

    高级排序比简单排序要快的多,简单排序的时间复杂度是O(N^2),希尔(shell)排序大约是O(N*(logN)^2),而快速排序是O(N*logN). 说明:下面以int数组的从小到大排序为例. 希 ...

  9. 算法笔记_023:拓扑排序(Java)

    目录 1 问题描述 2 解决方案 2.1 基于减治法实现 2.2 基于深度优先查找实现 1 问题描述 给定一个有向图,求取此图的拓扑排序序列. 那么,何为拓扑排序? 定义:将有向图中的顶点以线性方式进 ...

随机推荐

  1. Poj2231 Moo Volume 2017-03-11 22:58 30人阅读 评论(0) 收藏

    Moo Volume Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22104   Accepted: 6692 Descr ...

  2. Windbg and resources leaks in .NET applications 资源汇总

    Windows Forms Leaks 1.http://blogs.msdn.com/b/tess/archive/2008/02/04/net-debugging-demos-informatio ...

  3. Centos7 Minni 安装 执行ifconfig命令出现 -bash ifconfig command not found 的解决方法

    1) have a root privilege shell or be on the sudo list. 2a) At a root shell prompt (#) yum install ne ...

  4. Solr之functionQuery(函数查询)

    Solr函数查询 让我们可以利用 numeric域的值 或者 与域相关的的某个特定的值的函数,来对文档进行评分. 怎样使用函数查询 这里主要有两种方法可以使用函数查询,这两种方法都是通过solr ht ...

  5. C# WebService调用方法

    public class WebServiceHelper    {        /// < summary>         /// 动态调用web服务         /// < ...

  6. C#读取MP3文件的专辑图片和ID3V2Tag信息(带代码)

    第二次更新,后面的代码有问题,有些专辑图片读取不到.发现是PNG图片的问题.在读取的过程中调试发现,图片帧前10个字节包含了图片的格式,在有些歌曲写着JPEG的格式,数据却是PNG的.先说下思路. j ...

  7. 流式处理框架storm浅析(下篇)

    本文来自网易云社区 作者:汪建伟 举个栗子 1 实现的目标 设计一个系统,来实现对一个文本里面的单词出现的频率进行统计. 2 设计Topology结构: 这是一个简单的例子,topology也非常简单 ...

  8. asp.net mvc全局异常捕获

    通过重写OnException方法形式实现. 1.自定义异常记录类并继承HandleErrorAttribute类. public class HandlerErrorAttribute : Hand ...

  9. jQuery--基本介绍与下载

    本篇内容: 1.jquery学习内容 2.jquery下载,引用 3.使用顺序 4.版本 5.jquery对象与DOM对象转化 jQuery认识: jQuery学习内容 选择器 筛选器 样式操作 文本 ...

  10. Codechef:Fibonacci Number/FN(二次剩余+bsgs)

    题面 传送门 前置芝士 \(bsgs\),\(Cipolla\) 题解 因为题目保证\(p\bmod 10\)是完全平方数,也就是说\(p\bmod 5\)等于\(1\)或\(-1\),即\(5\)是 ...