以文本方式查看主题 - 计算机科学论坛 (http://bbs.xml.org.cn/index.asp) -- 『 C/C++编程思想 』 (http://bbs.xml.org.cn/list.asp?boardid=61) ---- 各种排序算法VC下的实现 (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=30792) |
-- 作者:卷积内核 -- 发布时间:4/18/2006 4:56:00 PM -- 各种排序算法VC下的实现 排序算法是一种基本并且常用的算法。由于实际工作中处理的数量巨大,所以排序算法 对算法本身的速度要求很高。 而一般我们所谓的算法的性能主要是指算法的复杂度,一般用O方法来表示。在后面我将 给出详细的说明。 对于排序的算法我想先做一点简单的介绍,也是给这篇文章理一个提纲。 1.冒泡法: void BubbleSort(int* pData,int Count) void main() 倒序(最糟情况) 其他: 上面我们给出了程序段,现在我们分析它:这里,影响我们算法性能的主要部分是循环和交换, 若存在一常量K和起点n0,使当n>=n0时,有f(n)<=K*g(n),则f(n) = O(g(n))。(呵呵,不要说没 现在我们来看1/2*(n-1)*n,当K=1/2,n0=1,g(n)=n*n时,1/2*(n-1)*n<=1/2*n*n=K*g(n)。所以f(n) void main() 其他: 从运行的表格来看,交换几乎和冒泡一样糟。事实确实如此。循环次数和冒泡一样 3.选择法: void main() 其他: void main() 倒序(最糟情况) 其他: 上面结尾的行为分析事实上造成了一种假象,让我们认为这种算法是简单算法中最好的,其实不是, 最终,我个人认为,在简单排序算法中,选择法是最好的。 |
-- 作者:卷积内核 -- 发布时间:4/18/2006 4:58:00 PM -- 二、高级排序算法: 高级排序算法中我们将只介绍这一种,同时也是目前我所知道(我看过的资料中)的最快的。 它的工作看起来仍然象一个二叉树。首先我们选择一个中间值middle程序中我们使用数组中间值,然后 把比它小的放在左边,大的放在右边(具体的实现是从两边找,找到一对后交换)。然后对两边分别使 用这个过程(最容易的方法——递归)。 1.快速排序: void run(int* pData,int left,int right) //当左边部分有值(left<j),递归左半边 void QuickSort(int* pData,int Count) void main() 这里我没有给出行为的分析,因为这个很简单,我们直接来分析算法:首先我们考虑最理想的情况 |
-- 作者:卷积内核 -- 发布时间:4/18/2006 5:00:00 PM -- 三、其他排序 1.双向冒泡: 通常的冒泡是单向的,而这里是双向的,也就是说还要进行反向的工作。 代码看起来复杂,仔细理一下就明白了,是一个来回震荡的方式。 这样可以在冒泡的基础上减少一些交换(我不这么认为,也许我错了)。 反正我认为这是一段有趣的代码,值得一看。 #include <iostream.h> void 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(pData[i]<pData[i-1]) { iTemp = pData[i]; pData[i] = pData[i-1]; pData[i-1] = iTemp; t = i; } } left = t+1; //反向的部分 void main() int iTemp; void main() |
-- 作者:卷积内核 -- 发布时间:4/18/2006 5:01:00 PM -- 四、基于模板的通用排序: 这个程序我想就没有分析的必要了,大家看一下就可以了。不明白可以在论坛上问。 MyData.h文件 /////////////////////////////////////////////////////// class CMyData { public: CMyData(int Index,char* strData); CMyData(); virtual ~CMyData(); int m_iIndex; private: MyData.cpp文件 CMyData::~CMyData() CMyData::CMyData(int Index,char* strData): CMyData& CMyData::operator =(CMyData &SrcData) bool CMyData::operator <(CMyData& data ) bool CMyData::operator >(CMyData& data ) ////////////////////////////////////////////////////////// template <class T> //当左边部分有值(left<j),递归左半边 template <class T> void main() |
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
105.469ms |