排序算法
文章平均质量分 77
YF_Li123
生活需要奔跑
展开
-
C++排序算法之冒泡排序
冒泡排序思想:通过一系列的“交换”动作完成。首先第一个记录和第二个记录比较,如果第一个大,则二者交换,否则不交换;然后第二个记录和第三个记录比较,如果第二个大,则二者交换,否则不交换..........一直按这种方式进行下去,最终最大的那个记录被交换到了最后,一趟冒泡排序完成。这个过程中,大的记录像一块石头一样“沉底”,小的记录逐渐向上“浮动”,冒泡排序的名字由此而来。例如原创 2017-07-13 09:23:12 · 539 阅读 · 0 评论 -
C++排序算法之计数排序
计数排序像快排、堆排、归并等排序算法都是基于比较的排序算法,时间复杂度最好情况也只能降到O(nlogn)。计数排序是一种线性排序算法,不需要进行比较,时间复杂度为O(n)。(注意是计数排序不是基数排序,两者不同)基本思想是:对于每个元素x,找出比x小的数的个数,从而确定x在排好序的数组中的位置。此算法需要辅助数组,是以空间换时间。举例说明:原始数组:arr原创 2017-08-08 19:03:33 · 8470 阅读 · 4 评论 -
C++排序算法之基数排序
基数排序基数排序是一种非比较的排序算法,它是以桶排序为基础的,其思想是“多关键字排序”。基数排序有两种实现方式:(1)最高位优先:即先按最高位排成若干子序列,在对每个子序列按次高位排序。 举例:扑克牌的例子,就是先按花色排成4个子序列,在对每种花色的13张牌进行排序,最终使所有的扑克牌整体有序。(2)最低位优先:这种方式不必分成子序列,每次排序全体元素都参与原创 2017-07-31 15:13:45 · 1799 阅读 · 0 评论 -
C++排序算法之希尔排序
希尔排序(1)算法介绍 希尔排序又叫做缩小增量排序,其本质还是插入排序,只不过是将待排序的序列按照某种规则分成几个子序列,分别对这几个子序列进行直接插入排序。这个规则就是增量。例如,先以增量5来分割序列,即将下标为1,6,11,16........的记录分成一组,将下标为2,7,12,17,........的记录分成另外一组等,然后分别对这些组进行直接插入排序,这就是一原创 2017-07-14 07:34:21 · 598 阅读 · 0 评论 -
C++排序算法之快速排序
快速排序算法快速排序是实际中最常用的一种排序算法,速度快,效率高。思想:快速排序采用的是分治的思想(1)在待排序的元素中任取一个元素作为基准(通常选第一个元素,但是最好的选择方法是从待排元素中随机选取一个作为基准),成为基准元素;(2)将待排的元素进行分区,比基准元素大的元素放在它的右边,比它小的元素放在左边;(3)对左右两个分区重复以上步骤直到所有的元素都是有原创 2017-07-13 10:44:49 · 545 阅读 · 0 评论 -
C++排序算法之归并排序
归并排序(1)算法介绍 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法的一个非常典型的应用,归并排序将两个已经有序的序列合并成一个有序的序列。 思路:假设我们有一个没有排好序的序列,那么我们首先使用分割的方法将这个序列分割成一个个已经排好序的子序列(当一个序列只有一个元素时,该序列自然是有序的)。然后再利用归并的方法将一个个有序的子序列合并成原创 2017-07-13 16:09:34 · 11805 阅读 · 2 评论 -
各排序算法时间复杂度和空间复杂度对比总结
各排序算法时间复杂度和空间复杂度对比总结排序算法稳定性:是指待排序列的序列中有两个或两个以上相同的项,排序前和排序后,看这些相同的项的相对位置有没有发生变化。如果没有发生变化,就是稳定的;如果发生变化,就是不稳定的。对于算法的平均时间复杂度和稳定性的一种快速记忆法原创 2017-07-14 07:40:03 · 1090 阅读 · 0 评论 -
C++排序算法之位图法排序
位图法排序(1)问题描述《编程珠玑》里有这样一个问题: 1.输入:一个至多包含1千万个非负整数的文件 2.特征:①每个数都是小于10000000的非负整数;②没有重复的数字;③数据之间不存在关联关系。 3.约束:①最多1MB的内存空间可用;②磁盘空间充足;③运行时间最多几分钟,最好是线性时间。 4.输出:按升序排列的整数序列。原创 2017-07-14 07:38:54 · 1389 阅读 · 0 评论 -
C++排序算法之简单选择排序
简单选择排序算法(1)算法介绍简单选择排序采用最简单的选择方式,从头到尾顺序扫描序列,找出最小的一个记录,和第一个记录交换,接着从剩下的记录中继续这种选择和交换,最终使序列有序。(2)执行过程下面举例说明简单选择排序的执行过程:原始序列:3 5 2 9 7 8 4 1 6 10在选择排序的过程中,把整个序列分为有序部分(绿色)和无序部分(红原创 2017-07-14 07:34:38 · 3116 阅读 · 0 评论 -
C++排序算法之堆排序
堆排序算法1、算法介绍 堆是一种数据结构,可以把堆看成一棵完全二叉树,这可完全二叉树满足:任何一个非叶子结点的值都不大于(或者不小于)其左右孩子结点的值。若父亲大孩子小,则叫做大顶堆,若父亲小孩子大,则叫做小顶堆。 根据堆的定义知道,代表堆的这棵完全二叉树的根结点的值是最大(或最小)的,因此将一个无序序列调整为一个堆,就可以找出这个序列的最大(或最小)值,然后将原创 2017-07-13 14:49:53 · 549 阅读 · 0 评论 -
C++排序算法之插入排序
直接插入排序思路:将数组分成两部分,前一部分是已经有序的序列,后一部分是待排序列。每一趟将待排序列的第一个元素作为关键字,根据其关键字的大小插入到已经排好序的那部分序列的适当位置,知道插入完成,整个序列有序为止。例如:3 6 4 2 1 8 5 7(1)开始只看到3,一个数当然是有序的3 6 4 2 1 8 5 7(2)插入原创 2017-07-13 09:57:25 · 514 阅读 · 0 评论 -
实现一个排序算法,对0~n-1范围内的n个不重复的无序数组进行排序,时间复杂度为O(n),空间复杂度为O(1)。
题目:实现一个排序算法,对0~n-1范围内的n个不重复的无序数组进行排序,时间复杂度为O(n),空间复杂度为O(1)。思想:从头到尾扫描这个数组中的每个数字,当扫描到下标为i的数字是,首先比较这个数字(假设为m)是不是等于i,如果等于继续下去;如果不等于则就和第m个位置的数字交换,依次重复下去,直到循环结束。代码如下:#include #include using namespace原创 2017-08-08 19:14:16 · 2114 阅读 · 0 评论