
算法
芝麻开花不开门
这个作者很懒,什么都没留下…
展开
-
常用算法
冒泡排序:冒泡排序是一种极其简单的排序算法,也是我接触到的第一种算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端。快速排序:快速排序是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成原创 2017-09-08 20:04:55 · 362 阅读 · 23 评论 -
【Java】简单选择排序
简单选择排序属于选择类排序方法,它的改进是堆排序。基本思想简单选择排序的基本思想非常简单(假设从小到大排序):第一趟,从 n 个元素中找出关键字最小的元素与第一个元素交换;第二趟,在从第二个元素开始的 n-1 个元素中再选出关键字最小的元素与第二个元素交换;如此,第 k 趟,则从第 k 个元素开始的 n-k+1 个元素中选出关键字最小的元素与第 k 个元素交换,直到整个序列按关键字有序。排序...原创 2019-07-06 15:23:34 · 519 阅读 · 1 评论 -
【Java】希尔排序
希尔排序又称为“缩小增量排序”,它属于插入类排序方法,是对直接插入排序的改进。基本思想首先将待排序的元素分为多个子序列,使得每个子序列的元素个数相对较少,对各个子序列分别进行直接插入排序,待整个待排序序列“基本有序”后,再对所有元素进行一次直接插入排序。 排序过程 小结...原创 2019-07-06 15:11:54 · 695 阅读 · 1 评论 -
【Java】堆排序代码实现
堆排序是简单选择排序的改进,我们先来简单介绍一个概念:堆。堆的定义:n个元素的序列{k1 , k2 , … , kn},当且仅当满足下列关系时,称之为堆。满足条件1,则称之为小顶堆;满足条件2,则称之为大顶堆。堆排序要解决两个问题:(1)将n个元素的序列按关键字建成堆;(2)输出堆顶元素后,堆的调整。堆排序代码实现如下:import java.util.Arra...原创 2019-06-28 15:29:29 · 760 阅读 · 4 评论 -
【Java】快速排序实现
交换类排序主要是通过两两比较待排元素的关键字,若发现与排序要求相逆,则“交换”之。在这类排序方法中最常见的是冒泡排序和快速排序。上一篇简单写了冒泡排序,这次简单写一写快速排序。快速排序的思想:快速排序是将分治法运用到排序问题中的一个典型例子,其基本思想是:通过一个枢轴(pivot)元素将 n 个元素的序列分为左、右两个子序列 Ll 和 Lr,其中子序列 Ll中的元素均比枢轴元素小,而子序列...原创 2019-06-24 20:53:03 · 3498 阅读 · 2 评论 -
【Java】冒泡排序实现
交换类排序主要是通过两两比较待排元素的关键字,若发现与排序要求相逆,则“交换”之。在这类排序方法中最常见的是冒泡排序和快速排序。简单写一写冒泡排序。冒泡排序的思想首先,将 n 个元素中的第一个元素和第二个元素进行比较,如果两个元素的位置为逆序,则交换两个元素的位置;进而比较第二个和第三个元素关键字,如此类推,直到比较第 n-1 个元素和第 n 个元素为止;上述过程描述了冒泡排序的第一趟排序...原创 2019-06-24 19:57:42 · 290 阅读 · 0 评论 -
【Java】折半插入排序实现
折半插入排序是插入类排序的其中一种,上一篇介绍的直接插入排序算法简便、容易实现,当待排序元素的数量n很小时,这是一种较好的排序方法。但是通常待排序元素数量 n 很大,则不宜采用直接插入排序方法,此时需要对直接插入排序进行改进。直接插入排序的基本操作是向有序序列中插入一个元素,插入位置的确定是通过对有序序列中元素按关键字逐个比较得到的。既然是在有序序列中确定插入位置,则可以不断二分有序序列来确定...原创 2019-06-26 08:25:56 · 857 阅读 · 4 评论 -
【Java】直接插入排序实现
插入类排序主要有三种排序方法:直接插入排序、折半插入排序和希尔排序。本次简要介绍直接插入排序的实现。直接插入排序的基本思想:仅有一个元素的序列总是有序的,因此,对 n 个记录的序列,可从第二个元素开始直到第 n 个元素,逐个向有序序列中执行插入操作,从而得到 n 个元素按关键字有序的序列。一般来说,在含有 j-1 个元素的有序序列中插入一个元素的方法是:从第 j-1 个元素开始依次向前...原创 2019-06-25 14:05:58 · 800 阅读 · 5 评论 -
【算法】快速排序
快速排序(Quicksort)是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。C#代码实现如下:using System;using S...原创 2018-08-19 16:37:48 · 225 阅读 · 8 评论 -
【算法】希尔排序
希尔排序(Shell's Sort)是插入排序的一种,又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成...原创 2018-08-26 11:16:29 · 273 阅读 · 12 评论 -
动态规划之0-1背包问题
//求最优解的值: int W = 17; //初始背包容量 int n = 5; //物品数量 int i; int w; int[] weight = { 3, 4, 7, 8, 9 }; //物品的重量 int[] v = {4, 5, 10原创 2017-11-05 21:54:22 · 317 阅读 · 0 评论 -
直接选择排序
直接选择排序算法也是一种比较简单的排序算法,它的基本思想是:在第i次选择操作中,通过n-i次键值间比较,从n-i+1个记录中选出键值最小的记录,并和第i(1 ≤ i ≤ n-1)个记录交换,算法简单描述如下:private void btnSorting_Click(object sender, EventArgs e) { int[] num = ne原创 2017-10-15 19:17:18 · 508 阅读 · 23 评论 -
直接插入排序
直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的纪录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的纪录插入完为止,得到一个新的有序序列。直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较的数值。内层循环为待比较数值确定其最终位置。直接插入排序是将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续原创 2017-10-22 19:04:59 · 518 阅读 · 24 评论 -
贪心算法
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,所做出的是在某种意义上的局部最优解。举一个简单的贪心法例子,平时购物找钱时,为使找回的零钱的硬币数最少,从最大面值的币种开始,按递减的顺序考虑各币种,先尽量用大面值的币种,当不足大面值币种的金额时才去考虑下一种较小面值的币种,这就是在采用贪心法。需要注意的是,贪心法并不总能得到最优解。原创 2017-10-28 14:23:24 · 489 阅读 · 31 评论 -
冒泡排序
冒泡排序是一种最简单、最基础的排序算法,它是通过依次比较相邻两个数来达到排序的目的的。其过程是将第一个记录键值与第二个记录键值进行比较,若为逆序,则将这两个记录交换,然后继续比较第二个和第三个记录的键值。依次类推,直到完成第n-1和第n个键值的比较,将比较出来的值放到第n个位置为止,这个过程便为第一趟排序。第二趟排序时,对前n-1个记录的键值进行比较,将比较出来的值放到第n-1个位置。重复以上过程原创 2017-10-05 18:14:59 · 329 阅读 · 16 评论 -
经典回溯算法之n皇后问题
这是来源于国际象棋的一个问题。n后问题要求在一个n×n格的棋盘上放置n个皇后,使得它们彼此不受攻击。按照国际象棋的规则,一个皇后可以攻击与之处在同一行或同一列或同一条斜线上的其他任何棋子。因此,n后问题等价于要求在一个n×n格的棋盘上放置n个皇后,使得任何两个皇后不能被放在同一行或同一列或同一条斜线上。原创 2017-09-30 12:25:29 · 1432 阅读 · 21 评论 -
【Java】归并排序
归并排序是另一类不同的排序方法,这种方法是运用分治法解决问题的典型范例。基本思想归并排序的基本思想是基于合并操作,即合并两个已经有序的序列是容易的,不论这两个序列是顺序存储还是链式存储,合并操作都可以在 Ο(m+n)时间内完成(假设两个有序表的长度分别为 m 和 n)。排序过程 归并排序的过程为:1. 划分:将待排序的序列划分为大小相等(或大致相等)的两个子序列;2. 治理:当子序列...原创 2019-07-06 15:47:26 · 188 阅读 · 1 评论