数据结构与算法
文章平均质量分 52
基础的数据结构与算法分析与实现
DestinedAI
添加微信公众号:语言智能技术笔记簿(ID: litnotes),获取更多人工智能技术干货笔记
展开
-
排序算法之冒泡排序
基本思想首先第一个元素和第二个元素比较,如果第一个大,则二者交换,否则不交换;然后第二个元素和第三个元素比较,如果第二个大,则二者交换,否则不交换……一直按这种方式进行下去,最终最大的那个元素被交换到了最后,一趟冒泡排序完成。代码public void BubbleSort(int[] a, int n) { int temp; for (int i = 1; i < n; i++)原创 2015-07-18 09:17:17 · 1299 阅读 · 0 评论 -
排序算法之简单选择排序
基本思想在一组元素中选择具有最小排序码的元素,若它不是这组元素中的第一个元素,则将它与这组元素中的第一个元素对调;在未排序的剩下的元素中重复执行以上步骤,直到剩余元素只有一个为止。代码private void selectSort(int[] a, int left, int right) { for (int i = left; i < right; i++) { int原创 2015-07-18 11:13:39 · 1240 阅读 · 0 评论 -
排序算法之堆排序
堆排序是一种树形选择排序,是对直接选择排序的有效改进。 堆是一种数据结构,其定义:任何一个非叶结点的值,都不大于(或不小于)其左右孩子结点的值。若父亲大孩子小,则这样的堆叫做大顶堆;若父亲小孩子大,则这样的堆叫做小顶堆。顾名思义,大顶堆的根结点的值是最大的,小顶堆的根结点的值是最小的。基本思想首先,将一个无序序列调整为大顶堆(小顶堆),我们就找到了这个无序序列的最大(或最小)值,然后将这个值交换到原创 2015-07-18 10:02:48 · 1311 阅读 · 0 评论 -
排序算法之基数排序
概述首先从多排序码排序开始介绍基数排序。以扑克牌排序为例。每张扑克牌有两个“排序码”:花色和面值。其有序关系为:花色:♣<♦<♥<♠♣ < ♦ < ♥ < ♠面值:2<3<4<5<6<7<8<9<10<J<Q<K<A2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < 10 < J < Q < K < A如果把所有扑克牌排成以下次序: ♣2,…,♣A,♦2,…,♦A,♥2,…,♥A原创 2015-07-18 20:24:05 · 1248 阅读 · 0 评论 -
排序算法之希尔排序
基本思想设待排元素序列有n个,首先取一个整数gap(gap//待排数据存储在数组a中,以及待排序列的左右边界public void ShellSort(int[] a, int left, int right) { int gap = right - left + 1;//划分子序列的间距 do { gap = gap / 3 + 1; for (i原创 2015-07-18 08:06:19 · 2329 阅读 · 0 评论 -
排序算法之二路归并排序
基本思想首先将待排序的元素序列分成两个长度相等的子序列,为每一个子序列排序,然后再将它们合并成一个序列。代码private void mergeSort(int[] a, int[] b, int left, int right) { if (left < right) { int middle = (left + right) / 2; mergeSort(原创 2015-07-18 10:07:22 · 2963 阅读 · 0 评论 -
排序算法之二分法(折半)插入排序算法
基本思想折半插入排序的基本思想与直接插入排序一样,在插入第i(i≥1)个元素时,前面i-1个元素已经排好序。区别在于寻找插入位置的方法不同,折半插入排序是采用折半查找法来寻找插入位置的。 折半查找法的基本思路是:用待插元素的值与当前查找序列的中间元素的值进行比较,以当前查找序列的中间元素为分界,确定待插元素是在当前查找序列的左边还是右边,如果是在其左边,则以该左边序列为当前查找序列,右边也类似。按原创 2015-07-18 07:59:34 · 18554 阅读 · 0 评论 -
排序算法之三路划分的快速排序
当待排序元素序列中有大量的重复排序码时,简单的快速排序算法的效率将会降到非常之低。一种直接的想法就是将待排序列分成三个子序列:一部分是排序码比基准元素排序码小的;一部分是与基准元素排序码等值的;一部分是比基准元素排序码大的,如下图所示: 但是,如果我们直接据此思想去编写实现算法的话,会让我们面临很大的困难。与基准元素等值的元素到底有多少?以及如何最快速有效地确定划分的边界?所以,完成这样的三路原创 2015-07-18 09:39:53 · 8465 阅读 · 0 评论 -
经典排序算法分析及其Java实现
排序可分为两种:内排序和外排序。在排序过程中,全部记录存放在内存,称为内排序;如果排序过程中需要使用外存,则成为外排序。 内排序有以下几类:插入类排序:直接插入排序、二分法(折半)插入排序、希尔(缩小增量)排序选择类排序:简单选择排序、堆排序交换类排序:冒泡排序、快速排序、三路划分的快速排序归并类排序:二路归并排序基数类排序:MSD基数排序、LSD基数排序各种内部排序算法的比较直接插入原创 2015-07-18 07:45:59 · 912 阅读 · 0 评论 -
排序算法之直接插入排序
基本思想当插入第i(i≥1)个元素,前面的i-1个元素已经排好序。这时用第i个元素与前i-1个元素进行比较,找到插入位置即将第i个元素插入,原来位置上的元素向后顺移。 代码://待排数据存储在数组a中,以及待排序列的左右边界public void InsertSort(int[] a, int left, int right) {int temp;//临时变量int i, j;//循环标记原创 2015-07-18 07:54:07 · 1494 阅读 · 0 评论 -
排序算法之快速排序
基本思想任取待排元素序列中的某个元素(例如第一个元素)作为基准,按照该元素的排序码大小,将整个元素序列划分为左右两个子序列:左侧子序列中所有元素的排序码都小于基准元素的排序码,右侧子序列中所有元素的排序码都大于或等于基准元素的排序码,基准元素则排在这两个子序列中间(这也是该元素最终安放的位置)。然后分别对这两个子序列重复进行上述方法,直到所有的元素都排在相应的位置上为止。代码private void原创 2015-07-18 09:20:51 · 1154 阅读 · 0 评论