![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
1.3-编程基础之查找与排序
fei20121106
这个作者很懒,什么都没留下…
展开
-
(1.3.3)插入排序:直接插入、交换插入、折半插入
插入排序:把一个数插入到一个有序的序列中,并要求插入后此数据序列仍然有序。这种排序思想就是插入排序。 那么对于一个原始无序的序列,哪里找有序的部分呢?这个很简单,可以把序列分为两个部分,第一个元素是第一部分,其余元素是第二部分。第一个部分只有一个元素,当然是有序的!对于如何把其余元素插入到第一部分中去,按插入策略,可分为如下几种插入方法:直接插入:每次a[i]先和前面转载 2015-03-16 18:11:11 · 21745 阅读 · 0 评论 -
(1.3.1)各查找和排序等算法一览
算法 平均时间 最差时间 稳定度 空间 备注 冒泡 O(n2) O(n2) 稳定 O(1) n小时较好 交换 O(n2) O(n2) 不稳定 O(1) n小时较好 选择 O(n2) O(n2) 不稳定 O(1) n小时较好 插入 O(n2) O(n2) 稳定 O(1) 大部分已排序时较好原创 2015-03-16 14:55:41 · 1107 阅读 · 0 评论 -
(1.3.4.1)交换排序:快速排序
快速排序(Quick Sort)也是一种交换排序,它在排序中采取了分治策略。快速排序的主要思想:从待排序列中选取一元素作为轴值(也叫主元)。将序列中的剩余元素以该轴值为基准,分为左右两部分。左部分元素不大于轴值,右部分元素不小于轴值。轴值最终位于两部分的分割处。对左右两部分重复进行这样的分割,直至无可分割。从快速排序的算法思想可以看出,这是一递归的过程。转载 2015-03-17 12:32:48 · 859 阅读 · 0 评论 -
(1.3.3.3) 插入排序:希尔排序
我们知道当一个序列基本有序时,直接插入会变得很高效。因为此时只需少量的移动元素,操作集中在元素的比较上。基于这种想法,我们就试图把一个序列在进行直接插入前调整得尽量有序。这就是希尔排序(Shell Sort)的核心思路。(Shell只是算法发明者的名字,无特殊含义)那到底该怎么做呢? 希尔排序一反以前的做法,插入为何只在相邻的元素之间进行,不相邻的同样可以进行。于是,希尔排序转载 2015-03-17 12:10:10 · 569 阅读 · 0 评论 -
(1.3.2.2)查找:斐波那契查找
原理:利用斐波那契数列的性质,黄金分割的原理来确定mid的位置。 优势:与二分查找相比,斐波那契查找算法的明显优点在于它只涉及加法和减法运算,而不用除法。因为除法比加减法要占去更多的机时,因此,斐波那契查找的平均性能要比折半查找好。 斐波那契查找的核心是: 1)当key=a[mid]时,查找成功; 2)当key#include <stdio.h>void fibonacci(int原创 2015-03-16 16:27:18 · 1072 阅读 · 0 评论 -
(1.3.7.1)选择排序:堆排序
堆排序(Heap Sort):使用堆这种数据结构来实现排序。先看下堆的定义:最小堆(Min-Heap)是关键码序列{k0,k1,…,kn-1},它具有如下特性:ki2i+1,ki2i+2(i=0,1,…)简单讲:孩子的关键码值大于双亲的。同理可得,最大堆(Max-Heap)的定义:ki>=k2i+1,ki>=k2i+2(i=0转载 2015-03-23 11:30:38 · 599 阅读 · 0 评论 -
(1.3.7)选择排序:简单选择、树形选择
选择排序(Selection Sort) 经过一趟排序,可以从n-i+1(i=1,2...)个记录中选取关键字最小的记录作为有序序列中第i个记录。也就是说,每一趟排序,都会排好一个元素的最终位置。最简单的是 简单选择排序(Simple Selection Sort,也叫直接选择排序) 简单选择排序的思想:在每一趟排序中,通过n-i次关键字的比较,从转载 2015-03-23 11:28:49 · 811 阅读 · 0 评论 -
(1.3.2.3)查找:位图法
位图(bit-map)法是一种逻辑上很巧妙的描述集合的方法。如集合S={2,4,1,5,12},它用位图描述就是 0110 1100 0000 1000,两个字节即可描述S,左边是低阶位。用bitset<16>存储的话就是{[15]、[14]、…[1]、[0]}={0001000000110110}。用位图对集合进行描述后,就很方便进行集合的运算,如交、并和差。下面来演示具体操作集合S={1,2,4转载 2015-03-16 16:31:07 · 818 阅读 · 0 评论 -
(1.3.6)线性排序:计数排序
前言一般的排序都是需要进行关键字的比较的。有没有不需要比较的的呢?有的,计数排序就是其中一种。计数排序假设输入序列都是0到k之间的整数,则可使用计数排序。具体操作是这样的:创建一个同类型同等大小的临时数组temp,用于备份输入序列。创建一个整型大小为k的数组count,用于统计序列中各元素出现的次数。接下来只需把备份序列从大到小放回原数组即可。一个示例图:转载 2015-03-17 21:12:10 · 682 阅读 · 0 评论 -
(1.3.6.2)线性排序:桶排序
桶排序桶排序(Bucket Sort)是对基数排序的一个变种。在排序过程中没有用到计数数组,而是用不同的桶来暂时存储关键字。看一个示意图:排序序列 123 234 45 111 6 128整个过程就是在不断地分配、收集。并且每一个桶都是队列,所以收集的时候得按先进先出的原则,且从第0个桶开始收集。在实际应用中,根据桶的创建策略,桶排序也有不同的写法。下面转载 2015-03-17 21:22:45 · 661 阅读 · 0 评论 -
(1.3.6.1)线性排序:基数排序
前言当序列中元素范围比较大时,就不适合使用计数排序。针对这种情况,就有了基数排序(Radix Sort),这是一种按位排序。它仍然是以计数排序为基础。基数排序基数排序的基数:十进制数的基数自然是10,二进制的基数自然是2。通常有两种按位排序策略:1.高位优先法(most significant digit first,MSD):简单讲就是从高位排起。2.低位优先法(leas转载 2015-03-17 21:16:00 · 743 阅读 · 0 评论 -
(1.3.4)交换排序:冒泡排序
交换排序:两两比较待排序记录的关键码,若是逆序,则交换,直到无逆序。其中最简单的交换排序是:冒泡排序。冒泡排序(Bubble Sort,也叫起泡排序):不断地比较相邻的记录,若是不满足排序要求,则交换。交换时,可从前向后,也可从后向前。看一个从前向后的排序过程:原序列 12 3 45 33 6下标 0 1 2 3 4第一趟:转载 2015-03-17 12:24:19 · 656 阅读 · 0 评论 -
(1.3.3.2)插入排序:表折半插入
我们用静态链表的存储方式,直接插入的策略,构建了一种新的插入排序算法:表插入。有人可能会想到:同样是静态链表的形式,为什么不使用更高效的折半插入策略呢?这种想法真的很好,如果做到了,显然是极大的优化。 我在网上还真看到了相关的内容,大家可搜下《表插入方法的改进》,里面有此想法的介绍。这篇博客就是介绍表插入的另一种实现:表折半插入。看完一定让你彻底理解它!与一般的折半插入相比,有如下的转载 2015-03-17 12:06:04 · 656 阅读 · 0 评论 -
(1.3.3.1)插入排序:二路插入
在上一篇博客中:插入排序:直接插入、交换插入、折半插入。提到了三种插入排序的具体实现。不过仍有改进的地方。例如序列 2 1 3,当把1往前插入时,由于1思路:构建一相同大小的循环数组b,把原数组的元素依次插入,最后按合适次序赋值回原数组。如何实现循环呢?有办法的。可参考约瑟夫问题的数组解法中是如何实现的。把原数组的第一个值a[0]复制过去,b[0]=a[0]转载 2015-03-17 11:56:58 · 747 阅读 · 0 评论 -
(1.3.2.1)查找:二分查找与差值查找
二分查找法有一个很重要的前提条件:即待查找的序列必须是已经排好序的。 假设元素序列是按升序排列,将序列中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将序列分成前、后两个子序列,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子序列,否则进一步查找后一子序列。重复以上过程,直到找到满足条件的记录,查找成功,返回元素在序列中的索引,或直到子序列不存在原创 2015-03-16 16:03:25 · 964 阅读 · 0 评论 -
(1.3.2)查找:顺序查找与哨兵
简单顺序查找对数据表的特性没有要求,即是否具有递增递减特性基本不影响查找的性能。基本死就是从表的一段开始逐个比较元素,若找到则返回元素在表中对应位置;否则,则返回一个无意义的位置标识。/* 顺序查找,a为数组,n为要查找的数组元素个数,key为要查找的关键字*/int Sequential_Search(int *a, int n, int key){ int i = 0;原创 2015-03-16 15:48:03 · 5600 阅读 · 5 评论 -
(1.3.5)归并排序:二路归并
归并排序(Merge Sort)是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个有序的子序列,再把有序的子序列合并为整体有序序列。归并排序的具体做法:把原序列不断地递归等分,直至每等份只有一个元素,此时每等份都是有序的。相邻等份合并,不断合并,直至合并完全。二路归并归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治转载 2015-03-17 21:07:07 · 816 阅读 · 0 评论