导航:首页 > 源码编译 > 算法比较

算法比较

发布时间:2022-02-10 01:45:05

A. 几种常用的排序算法比较

排序,从小大,0坐标的在下面,即排序后小的在下面,大的在上面。

1,冒泡Bubble:从第0个开始,一直往上,与相邻的元素比较,如果下面的大,则交换。
Analysis:
Implementation:
void BubbleSort(int *pData, int iNum)

2,插入Insertion:与打扑克牌时整理牌很想象,假定第一张牌是有序的,从第二张牌开始,拿出这张牌来,往下比较,如果有比这张牌大的,则把它拨到上一个位置,直到找到比手上的这张更小的(或到顶了),
则把手上的这张牌插入到这张更小的牌的后面。
Analysis:
Implementation:
void InsertionSort(int *list, int length)
{
int i, j, temp;
for (i = 1; i < length; i++)
{
temp = list[i];
j = i - 1;
while ((j >= 0) && (list[j] > temp))
{
list[j+1] = list[j];
j--;
}
list[j+1] = temp;
}
}

3,选择Selection:从所有元素中找到最小的放在0号位置,从其它元素(除了0号元素)中再找到最小的,放到1号位置,......。
Analysis:
Implementation:
void SelectionSort(int data[], int count)
{
int i, j, min, temp;
for (i = 0; i < count - 1; i++)
{
/* find the minimum */
min = i;
for (j = i+1; j < count; j++)
{
if (data[j] < data[min])
{
min = j;
}
}
/* swap data[i] and data[min] */
temp = data[i];
data[i] = data[min];
data[min] = temp;
}
}

4,快速Quick:先拿出中间的元素来(值保存到temp里),设置两个索引(index or pointer),一个从0号位置开始往最大位置寻找比temp大的元素;一个从最大号位置开始往最小位置寻找比temp小的元素,找到了或到顶了,则将两个索引所指向的元素
互换,如此一直寻找交换下去,直到两个索引交叉了位置,这个时候,从0号位置到第二个索引的所有元素就都比temp小,从第一个索引到最大位置的所有元素就都比temp大,这样就把所有元素分为了两块,然后采用前面的办法分别排序这两个部分。总的来
说,就是随机找一个元素(通常是中间的元素),然后把小的放在它的左边,大的放右边,对左右两边的数据继续采用同样的办法。只是为了节省空间,上面采用了左右交换的方法来达到目的。
Analysis:
Implementation:
void QuickSort(int *pData, int left, int right)
{
int i, j;
int middle, iTemp;
i = left;
j = right;

middle = pData[(left + right) / 2]; //求中间值
do
{
while ((pData[i] < middle) && (i < right)) //从左扫描大于中值的数
i++;

while ((pData[j] > middle) && (j > left)) //从右扫描小于中值的数
j--;

if (i <= j) //找到了一对值
{
//交换
iTemp = pData[i];
pData[i] = pData[j];
pData[j] = iTemp;
i++;
j--;
}
} while (i <= j); //如果两边扫描的下标交错,就停止(完成一次)

//当左边部分有值(left<j),递归左半边
if(left < j)
QuickSort(pData, left, j);

//当右边部分有值(right>i),递归右半边
if(right > i)
QuickSort(pData, i, right);
}

5,希尔Shell:是对Insertion Sort的一种改进,在Insertion Sort中,从第2个位置开始取出数据,每次都是与前一个(step/gap==1)进行比较。Shell Sort修改为,在开始时采用较大的步长step,
从第step位置开始取数据,每次都与它的前step个位置上的数据进行比较(如果有8个数据,初始step==4,那么pos(4)与pos(0)比较,pos(0)与pos(-4),pos(5)与pos(1),pos(1)与pos(-3),
...... pos(7)与pos(3),pos(3)与pos(-1)),然后逐渐地减小step,直到step==1。step==1时,排序过程与Insertion Sort一样,但因为有前面的排序,这次排序将减少比较和交换的次数。
Shell Sort的时间复杂度与步长step的选择有很大的关系。Shell排序比冒泡排序快5倍,比插入排序大致快2倍。Shell排序比起QuickSort,MergeSort,HeapSort慢很多。但是它相对比较简单,它适合
于数据量在5000以下并且速度并不是特别重要的场合。它对于数据量较小的数列重复排序是非常好的。
Analysis:
Implementation:
template<typename RandomIter, typename Compare>
void ShellSort(RandomIter begin, RandomIter end, Compare cmp)
{
typedef typename std::iterator_traits<RandomIter>::value_type value_type;
typedef typename std::iterator_traits<RandomIter>::difference_type diff_t;

diff_t size = std::distance(begin, end);
diff_t step = size / 2;
while (step >= 1)
{

for (diff_t i = step; i < size; ++i)
{
value_type key = *(begin+i);
diff_t ins = i; // current position

while (ins >= step && cmp(key, *(begin+ins-step)))
{
*(begin+ins) = *(begin+ins-step);
ins -= step;
}

*(begin+ins) = key;
}

if(step == 2)
step = 1;
else
step = static_cast<diff_t>(step / 2.2);
}
}

template<typename RandomIter>
void ShellSort(RandomIter begin, RandomIter end)
{
typedef typename std::iterator_traits<RandomIter>::value_type value_type;
ShellSort(begin, end, std::less<value_type>());
}

6,归并Merge:先将所有数据分割成单个的元素,这个时候单个元素都是有序的,然后前后相邻的两个两两有序地合并,合并后的这两个数据再与后面的两个合并后的数据再次合并,充分前面的过程直到所有的数据都合并到一块。
通常在合并的时候需要分配新的内存。
Analysis:
Implementation:
void Merge(int array[], int low, int mid, int high)
{
int k;
int *temp = (int *) malloc((high-low+1) * sizeof(int)); //申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
int begin1 = low;
int end1 = mid;
int begin2 = mid + 1;
int end2 = high;

for (k = 0; begin1 <= end1 && begin2 <= end2; ++k) //比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
{
if(array[begin1]<=array[begin2])
{
temp[k] = array[begin1++];
}
else
{
temp[k] = array[begin2++];
}
}
if(begin1 <= end1) //若第一个序列有剩余,直接拷贝出来粘到合并序列尾
{
memcpy(temp+k, array+begin1, (end1-begin1+1)*sizeof(int));
}
if(begin2 <= end2) //若第二个序列有剩余,直接拷贝出来粘到合并序列尾
{
memcpy(temp+k, array+begin2, (end2-begin2+1)*sizeof(int));
}
memcpy(array+low, temp, (high-low+1)*sizeof(int));//将排序好的序列拷贝回数组中
free(temp);
}

void MergeSort(int array[], unsigned int first, unsigned int last)
{
int mid = 0;
if (first < last)
{
mid = (first+last)/2;
MergeSort(array, first, mid);
MergeSort(array, mid+1,last);
Merge(array,first,mid,last);
}
}

B. 推荐一些算法比较好的书

刘汝佳的《算法艺术与信息学竞赛》,这本书很适合搞算法竞赛的看。
《算法导论》这本书就不用多说了,经典
Udi Manber 的《Introction to Algorithms: A Creative Approach》中文名《算法引论:一种创造性方法》
当然还有很多书,上面三本我有幸看过

C. 那些算法比较好用

你问的问题很难计算

D. 算法的速度如何比较呢

看嵌套循环语句的次数啊。其实现在电脑速度这么快基本上看不出算法的优劣。应该看算法本身的编写。嵌套的循环语句越多算法越慢。

E. 论文中算法比较是和最新的算法比吗

要原创,找国淘论文写作
每一种(类)丑陋的现象都会或多或少造成社会的损失。有些损失是明显的,人们不齿、唾弃;但一些损失在较长的时间段后才会出现,许多人看不到这种想象的危害,那就要揭示,这要求写作者既具有深邃的目光,透过现象看本质,又具有先知先觉的本领。
(这种一味的送去,造成物质的枯竭。)虽然有人说,掘起地下的煤来,就足够全世界几百年之用。但是,几百年之后呢?几百年之后,我们当然是化为魂灵,或上天堂,或落了地狱,但我们的子孙是在的,所以还应该给他们留下一点礼品。要不然,则当佳节大典之际,他们拿不出东西来,只好磕头贺喜,讨一点残羹冷炙做奖赏。这种奖赏,不要误解为“抛来”的东西,这是“抛给”的,说得冠冕些,可以称之为“送来”,我在这里不想举出实例。

F. 几种常见的查找算法之比较

二分法平均查找效率是O(logn),但是需要数组是排序的。如果没有排过序,就只好先用O(nlogn)的预处理为它排个序了。而且它的插入比较困难,经常需要移动整个数组,所以动态的情况下比较慢。

哈希查找理想的插入和查找效率是O(1),但条件是需要找到一个良好的散列函数,使得分配较为平均。另外,哈希表需要较大的空间,至少要比O(n)大几倍,否则产生冲突的概率很高。

二叉排序树查找也是O(logn)的,关键是插入值时需要做一些处理使得它较为平衡(否则容易出现轻重的不平衡,查找效率最坏会降到O(n)),而且写起来稍微麻烦一些,具体的算法你可以随便找一本介绍数据结构的书看看。当然,如果你用的是c语言,直接利用它的库类型map、multimap就可以了,它是用红黑树实现的,理论上插入、查找时间都是O(logn),很方便,不过一般会比自己实现的二叉平衡树稍微慢一些。

G. 比较两个算法的不同

l=l+0/s的位置不一样,第公式是o和s的值发生了变化。第二个公式,os的值还没发生变化。

H. 比较算法优缺点:

1.先来先服务先来先服务(FCFS, First Come First Serve)是最简单的调度算法,按先后顺序进行调度。1. 定义按照作业提交或进程变为就绪状态的先后次序,分派CPU;当前作业或进程占用CPU,直到执行完或阻塞,才出让CPU(非抢占方式)。在作业或进程唤醒后(如I/O完成),并不立即恢复执行,通常等到当前作业或进程出让CPU。2.适用场景比较有利于长作业,而不利于短作业。有利于CPU繁忙的作业,而不利于I/O繁忙的作业。
2. 轮转法轮转法(Round Robin)是让每个进程在就绪队列中的等待时间与享受服务的时间成正比例。1. 定义将系统中所有的就绪进程按照FCFS原则,排成一个队列。每次调度时将CPU分派给队首进程,让其执行一个时间片。时间片的长度从几个ms到几百ms。在一个时间片结束时,发生时钟中断。调度程序据此暂停当前进程的执行,将其送到就绪队列的末尾,并通过上下文切换执行当前的队首进程。进程可以未使用完一个时间片,就出让CPU(如阻塞)。2. 时间片长度的确定时间片长度变化的影响过长->退化为FCFS算法,进程在一个时间片内都执行完,响应时间长。过短->用户的一次请求需要多个时间片才能处理完,上下文切换次数增加,响应时间长。对响应时间的要求:T(响应时间)=N(进程数目)*q(时间片)就绪进程的数目:数目越多,时间片越小系统的处理能力:应当使用户输入通常在一个时间片内能处理完,否则使响应时间,平均周转时间和平均带权周转时间延长。
3. 多级反馈队列算法多级反馈队列算法(Round Robin with Multiple Feedback)是轮转算法和优先级算法的综合和发展。1. 定义设置多个就绪队列,分别赋予不同的优先级,如逐级降低,队列1的优先级最高。每个队列执行时间片的长度也不同,规定优先级越低则时间片越长,如逐级加倍。新进程进入内存后,先投入队列1的末尾,按FCFS算法调度;若按队列1一个时间片未能执行完,则降低投入到队列2的末尾,同样按FCFS算法调度;如此下去,降低到最后的队列,则按“时间片轮转”算法调度直到完成。仅当较高优先级的队列为空,才调度较低优先级的队列中的进程执行。如果进程执行时有新进程进入较高优先级的队列,则抢先执行新进程,并把被抢先的进程投入原队列的末尾。2.优点为提高系统吞吐量和缩短平均周转时间而照顾短进程。为获得较好的I/O设备利用率和缩短响应时间而照顾I/O型进程。不必估计进程的执行时间,动态调节3. 几点说明I/O型进程:让其进入最高优先级队列,以及时响应I/O交互。通常执行一个小时间片,要求可处理完一次I/O请求的数据,然后转入到阻塞队列。计算型进程:每次都执行完时间片,进入更低级队列。最终采用最大时间片来执行,减少调度次数。I/O次数不多,而主要是CPU处理的进程。在I/O完成后,放回优先I/O请求时离开的队列,以免每次都回到最高优先级队列后再逐次下降。为适应一个进程在不同时间段的运行特点,I/O完成时,提高优先级;时间片用完时,降低优先级。
4. 优先级法优先级算法(Priority Scheling)是多级队列算法的改进,平衡各进程对响应时间的要求。适用于作业调度和进程调度,可分成抢先式和非抢先式。1. 静态优先级作业调度中的静态优先级大多按以下原则确定:由用户自己根据作业的紧急程度输入一个适当的优先级。由系统或操作员根据作业类型指定优先级。系统根据作业要求资源情况确定优先级。进程的静态优先级的确定原则:按进程的类型给予不同的优先级。将作业的情态优先级作为它所属进程的优先级。2. 动态优先级进程的动态优先级一般根据以下原则确定:根据进程占用有CPU时间的长短来决定。根据就绪进程等待CPU的时间长短来决定。
5.短作业优先法短作业优先(SJF, Shortest Job First)又称为“短进程优先”SPN(Shortest Process Next);这是对FCFS算法的改进,其目标是减少平均周转时间。1. 定义对预计执行时间短的作业(进程)优先分派处理机。通常后来的短作业不抢先正在执行的作业。2. SJF的特点(1) 优点:比FCFS改善平均周转时间和平均带权周转时间,缩短作业的等待时间;提高系统的吞吐量;(2) 缺点:对长作业非常不利,可能长时间得不到执行;未能依据作业的紧迫程度来划分执行的优先级;难以准确估计作业(进程)的执行时间,从而影响调度性能。3. SJF的变型“最短剩余时间优先”SRT(Shortest Remaining Time)(允许比当前进程剩余时间更短的进程来抢占)“最高响应比优先”HRRN(Highest Response Ratio Next)(响应比R = (等待时间 + 要求执行时间) / 要求执行时间,是FCFS和SJF的折衷)6. 最高响应比优先法最高响应比优先法(HRN,Highest Response_ratio Next)是对FCFS方式和SJF方式的一种综合平衡。FCFS方式只考虑每个作业的等待时间而未考虑执行时间的长短,而SJF方式只考虑执行时间而未考虑等待时间的长短。因此,这两种调度算法在某些极端情况下会带来某些不便。HRN调度策略同时考虑每个作业的等待时间长短和估计需要的执行时间长短,从中选出响应比最高的作业投入执行。响应比R定义如下: R =(W+T)/T = 1+W/T其中T为该作业估计需要的执行时间,W为作业在后备状态队列中的等待时间。每当要进行作业调度时,系统计算每个作业的响应比,选择其中R最大者投入执行。这样,即使是长作业,随着它等待时间的增加,W / T也就随着增加,也就有机会获得调度执行。这种算法是介于FCFS和SJF之间的一种折中算法。由于长作业也有机会投入运行,在同一时间内处理的作业数显然要少于SJF法,从而采用HRN方式时其吞吐量将小于采用SJF 法时的吞吐量。另外,由于每次调度前要计算响应比,系统开销也要相应增加。

I. 怎么判断比较各种算法的好坏

首先,这个算法必须是正确的
其次,好的算法应该是友好的,便于人们理解和交流,并且是机器可执行的。
这个算法还需要足够健壮,即当输入的数据非法或不合理时,也能适当的做出正确的反应或进行相应的处理
最后它还必须拥有高效率和低存储量要求。
也就是楼上几位说的时间复杂度和空间复杂度
占的地方越小,算得越快的算法才是好算法。

J. 几种常用加密算法比较

对称加密算法用来对敏感数据等信息进行加密,常用的算法包括:
des(data
encryption
standard):数据加密标准,速度较快,适用于加密大量数据的场合。
3des(triple
des):是基于des,对一块数据用三个不同的密钥进行三次加密,强度更高。
aes(advanced
encryption
standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高;

阅读全文

与算法比较相关的资料

热点内容
al编译器研发工作难度 浏览:314
编译java用哪个软件好 浏览:703
电脑服务器显示r6什么意思 浏览:813
腾讯云拨号vps服务器 浏览:507
白日梦app哪个好看 浏览:295
编译时出现dtc 浏览:246
怎么编译eclipse源码 浏览:997
单片机pc什么意思 浏览:943
quartus绘好原理图后如何编译 浏览:355
哪个app可以找到很多宋亚轩的照片 浏览:421
国内能交易加密币 浏览:956
k8s编译法 浏览:976
绝地求生怎么去欧美服务器 浏览:832
哪个app有直租的房子信息 浏览:830
安卓手机怎么下老版本抖音 浏览:95
新轩逸经典如何安装安卓应用 浏览:20
php大流量网站 浏览:151
买车app哪个是正规的 浏览:174
python中的class是什么 浏览:204
安卓导航屏如何接灯光线 浏览:692