各种排序算法小结

上传人:xzh****18 文档编号:45327154 上传时间:2018-06-15 格式:PDF 页数:9 大小:135.57KB
返回 下载 相关 举报
各种排序算法小结_第1页
第1页 / 共9页
各种排序算法小结_第2页
第2页 / 共9页
各种排序算法小结_第3页
第3页 / 共9页
各种排序算法小结_第4页
第4页 / 共9页
各种排序算法小结_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《各种排序算法小结》由会员分享,可在线阅读,更多相关《各种排序算法小结(9页珍藏版)》请在金锄头文库上搜索。

1、1各种排序算法小结各种排序算法小结 排序算法是一种基本并且常用的算法。 由于实际工作中处理的数量巨大, 所以排序算法 对算法本身的速度要求很高。而 一般我们所谓的算法的性能主要是指算法的复杂度,一般用 O方法来表示。在后面我将 给出详细的说明。 对于排序的算法我想先做一点简单的介绍,也是给这篇文章理一个提纲。 我将按照算法的复杂度,从简单到难来分析算 法。 第一部分是简单排序算法,后面你将看到他们的共同点是算法复杂度为 O(N*N)(因为没有使用 word,所以无法打出上 标和下标) 。 第二部分是高级排序算法,复杂度为 O(Log2(N)。这里我们只介绍一种算法。另外还有几种 算法因为涉及树

2、 与堆的概念,所以这里不于讨论。 第三部分类似动脑筋。这里的两种算法并不是最好的(甚至有最慢的) ,但是算法本身比 较 奇特,值得参考(编程的角度) 。同时也可以让我们从另外的角度来认识这个问题。 第四部分是我送给大家的一个餐后 的甜点一个基于模板的通用快速排序。由于是模板函数 可以对任何数据类型排序(抱歉,里面使用了一些论坛专家的 呢称) 。 现在,让我们开始吧:一、简单排序算法一、简单排序算法 由于程序比较简单,所以没有加什么注释。所有的程序都给出了完整的运行代码,并在我的 VC 环境 下运行通过。因为没有涉及 MFC 和 WINDOWS的内容,所以在 BORLANDC+的平台上应该也不会

3、有什么 问题的。在代码的后面给出了运行过程示意,希望对理解有帮助。 1.冒泡法: 这是最原始,也是众所周知的最慢的算法了。他的名字的由来因为它的工作看来象是冒泡: #include void BubbleSort(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,

4、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 次) 循环次数:6 次 交换次数:3 次 上面我们给出了程序段,现在我们分析它:这里,影响我们算法性能的主要部分是循环和交换, 显然,次数越多,性能就 越差。从上面的程序我们可以看出循环的次数是固定的,为 1+2+.+n-1。 写成公式就是 1/2*(n-1)*n。 现在注意,我们给出 O方法的定义:2若存在一常量 K 和起点 n0,使当 n=n0时,有 f(n) void Exc

5、hangeSort(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(交换 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、环次数:6 次 交换次数:3 次 从运行的表格来看,交换几乎和冒泡一样糟。事实确实如此。循环次数和冒泡一样 也是 1/2*(n-1)*n,所以算法的复杂度仍 然是 O(n*n)。由于我们无法给出所有的情况,所以 只能直接告诉大家他们在交换上面也是一样的糟糕 (在某些情况下稍好, 在某些情况下稍差) 。3.选择法: 现在我们终于可以看到一点希望:选择法,这种方法提高了一点性能(某些情况下) 这种方法类似我们人为的排序习惯: 从数据中选择最小的同第一个值交换,在从省下的部分中 选择最小的与第二个交换,这样往复下去。 #include void SelectSort(int* pData,int C

7、ount)3 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 次) /iTemp 临时存放最小数 第二轮:7,9,8,10-7,9,8,10(iTemp=8)-(iTemp=8)7,8,9,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,

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)。 我们来看他的交换。由于每次外层循环只产 生一次交换(只有一个最小值) 。所以 f(n) void InsertSort(int* pData,int Count) int iTemp; int iPos; for(int i=1;i=0) int middle

9、,iTemp; i= left; j= right; middle = pData(left+right)/2;/求中间值 do while(pDataimiddle) if(ii),递归右半边 if(righti) run(pData,i,right); void QuickSort(int* pData,int Count) run(pData,0,Count-1); void main() int data = 10,9,8,7,6,5,4; QuickSort(data,7); for (int i=0;i void Bubble2Sort(int*pData,int Count) i

10、nt iTemp; int left = 1; int right =Count -1; int t; do /正向的部分 for(int i=right;i=left;i-) if(pDatai void 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) private: char* m_strDatamember; int m_iDataSize; ; /MyData.cpp文件 / CMyDa

11、ta:CMyData(): m_iIndex(0), m_iDataSize(0), m_strDatamember(NULL) CMyData:CMyData() if(m_strDatamember != NULL) delete m_strDatamember; m_strDatamember = NULL; CMyData:CMyData(int Index,char* strData): m_iIndex(Index), m_iDataSize(0), m_strDatamember(NULL) m_iDataSize =strlen(strData); m_strDatamembe

12、r = new charm_iDataSize+1; strcpy(m_strDatamember,strData); CMyData8m_iDataSize =SrcData.GetDataSize(); m_strDatamember = new charm_iDataSize+1; strcpy(m_strDatamember,SrcData.GetData(); return*this; bool CMyData:operator (CMyData / / /主程序部分 #include #include “MyData.h“ template void run(T*pData,int

13、 left,int right) int i,j; T middle,iTemp; i= left; j= right; /下面的比较都调用我们重载的操作符函数 middle = pData(left+right)/2;/求中间值 do while(pDataimiddle) if(ii),递归右半边 if(righti) run(pData,i,right); template void QuickSort(T* pData,int Count) run(pData,0,Count-1); void main() CMyData data = CMyData(8,“xulion“), CMyData(7,“sanzoo“), CMyData(6,“wangjun“), CMyData(5,“VCKBASE“),9CMyData(4,“jacky2000“), CMyData(3,“cwally“), CMyData(2,“VCUSER“), CMyData(1,“isdong“) ; QuickSort(data,8); for (int i=0;i8;i+) coutdatai.m_iIndex“datai.GetData()“n“; cout“n“;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号