收藏 分享(赏)

CC++笔试面试题目汇总3_各种排序算法.doc

上传人:精品资料 文档编号:10760758 上传时间:2020-01-07 格式:DOC 页数:10 大小:104KB
下载 相关 举报
CC++笔试面试题目汇总3_各种排序算法.doc_第1页
第1页 / 共10页
CC++笔试面试题目汇总3_各种排序算法.doc_第2页
第2页 / 共10页
CC++笔试面试题目汇总3_各种排序算法.doc_第3页
第3页 / 共10页
CC++笔试面试题目汇总3_各种排序算法.doc_第4页
第4页 / 共10页
CC++笔试面试题目汇总3_各种排序算法.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

1、C/C+笔试面试题目汇总 3各种排序算法 原文: O 方法来表示。在后面我将给出详细的说明。对于排序的算法我想先做一点简单的介绍,也是给这篇文章理一个提纲。我将按照算法的复杂度,从简单到难来分析算法。第一部分是简单排序算法,后面你将看到他们的共同点是算法复杂度为 O(N*N)(因为没有使用 word,所以无法打出上标和下标)。第二部分是高级排序算法,复杂度为 O(Log2(N)。这里我们只介绍一种算法。另外还有几种算法因为涉及树与堆的概念,所以这里不于讨论。第三部分类似动脑筋。这里的两种算法并不是最好的(甚至有最慢的),但是算法本身比较奇特,值得参考(编程的角度)。同时也可以让我们从另外的角度

2、来认识这个问题。第四部分是我送给大家的一个餐后的甜点一个基于模板的通用快速排序。由于是模板函数可以对任何数据类型排序(抱歉,里面使用了一些论坛专家的呢称)。一、简单排序算法由于程序比较简单,所以没有加什么注释。所有的程序都给出了完整的运行代码,并在我的 VC 环境下运行通过。因为没有涉及 MFC 和 WINDOWS 的内容,所以在 BORLAND C+的平台上应该也不会有什么问题的。在代码的后面给出了运行过程示意,希望对理解有帮助。1.冒泡法:(Gilbert:点这里有视频)这是最原始,也是众所周知的最慢的算法了。他的名字的由来因为它的工作看来象是冒泡:#include void Bubble

3、Sort(int* pData,int Count)int iTemp;for(int i=1;i=i;j-)if(pDataj10,9,7,8-10,7,9,8-7,10,9,8(交换 3 次)第二轮:7,10,9,8-7,10,8,9-7,8,10,9(交换 2 次)第一轮:7,8,10,9-7,8,9,10(交换 1 次)循环次数:6 次交换次数:6 次其他:第一轮:8,10,7,9-8,10,7,9-8,7,10,9-7,8,10,9(交换 2 次)第二轮:7,8,10,9-7,8,10,9-7,8,10,9(交换 0 次)第一轮:7,8,10,9-7,8,9,10(交换 1 次)循环

4、次数:6 次交换次数:3 次上面我们给出了程序段,现在我们分析它:这里,影响我们算法性能的主要部分是循环和交换,显然,次数越多,性能就越差。从上面的程序我们可以看出循环的次数是固定的,为 1+2+.+n-1。写成公式就是 1/2*(n-1)*n。现在注意,我们给出 O 方法的定义:若存在一常量 K 和起点 n0,使当 n=n0 时,有 f(n)void ExchangeSort(int* pData,int Count)int iTemp;for(int i=0;i9,10,8,7-8,10,9,7-7,10,9,8(交换 3 次)第二轮:7,10,9,8-7,9,10,8-7,8,10,9(

5、交换 2 次)第一轮:7,8,10,9-7,8,9,10(交换 1 次)循环次数:6 次交换次数:6 次其他:第一轮:8,10,7,9-8,10,7,9-7,10,8,9-7,10,8,9(交换 1 次)第二轮:7,10,8,9-7,8,10,9-7,8,10,9(交换 1 次)第一轮:7,8,10,9-7,8,9,10(交换 1 次)循环次数:6 次交换次数:3 次从运行的表格来看,交换几乎和冒泡一样糟。事实确实如此。循环次数和冒泡一样也是 1/2*(n-1)*n,所以算法的复杂度仍然是 O(n*n)。由于我们无法给出所有的情况,所以只能直接告诉大家他们在交换上面也是一样的糟糕(在某些情况下

6、稍好,在某些情况下稍差)。3.选择法:现在我们终于可以看到一点希望:选择法,这种方法提高了一点性能(某些情况下)这种方法类似我们人为的排序习惯:从数据中选择最小的同第一个值交换,在从省下的部分中选择最小的与第二个交换,这样往复下去。#include void SelectSort(int* pData,int Count)int iTemp;int iPos;for(int i=0;i(iTemp=9)10,9,8,7-(iTemp=8)10,9,8,7-(iTemp=7)7,9,8,10(交换 1 次)第二轮:7,9,8,10-7,9,8,10(iTemp=8)-(iTemp=8)7,8,9

7、,10(交换 1 次)第一轮:7,8,9,10-(iTemp=9)7,8,9,10(交换 0 次)循环次数:6 次交换次数:2 次其他:第一轮:8,10,7,9-(iTemp=8)8,10,7,9-(iTemp=7)8,10,7,9-(iTemp=7)7,10,8,9(交换 1 次)第二轮:7,10,8,9-(iTemp=8)7,10,8,9-(iTemp=8)7,8,10,9(交换 1 次)第一轮:7,8,10,9-(iTemp=9)7,8,9,10(交换 1 次)循环次数:6 次交换次数:3 次遗憾的是算法需要的循环次数依然是 1/2*(n-1)*n。所以算法复杂度为 O(n*n)。我们来

8、看他的交换。由于每次外层循环只产生一次交换(只有一个最小值)。所以 f(n)void InsertSort(int* pData,int Count)int iTemp;int iPos;for(int i=1;i=0) int middle,iTemp;i = left;j = right;middle = pData(left+right)/2; /求中间值dowhile(pDataimiddle) if(ii) ,递归右半边if(righti)run(pData,i,right);void QuickSort(int* pData,int Count)run(pData,0,Count-

9、1);void main()int data = 10,9,8,7,6,5,4;QuickSort(data,7);for (int i=0;ivoid Bubble2Sort(int* pData,int Count)int iTemp;int left = 1;int right =Count -1;int t;do/正向的部分for(int i=right;i=left;i-)if(pDataivoid ShellSort(int* pData,int Count)int step4;step0 = 9;step1 = 5;step2 = 3;step3 = 1;int iTemp;int k,s,w;for(int i=0;i=0) w = w-k;pDataw+k = iTemp;void main()int data = 10,9,8,7,6,5,4,3,2,1,-10,-1;ShellSort(data,12);for (int i=0;i12;i+)coutdatai“ “;cout“n“;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报