快速排序模板

dianyancao 2014-06-04 04:03:29
如何将下面的c#快速排序代码翻译成C++代码?
没有写过泛型的快速排序,以前对不同的类型,都写一份代码真的很蛋疼...
private void QuickSort<TValue>(T[] keys, TValue[] values, int left, int right, IComparer<T> 

comparer)
{
do
{
int index = left;
int num2 = right;
T y = keys[index + ((num2 - index) >> 1)];
do
{
try
{
while (comparer.Compare(keys[index], y) < 0)
{
index++;
}
while (comparer.Compare(y, keys[num2]) < 0)
{
num2--;
}
}
catch (IndexOutOfRangeException)
{
throw new ArgumentException(null, "keys");
}
catch (Exception)
{
throw new InvalidOperationException();
}
if (index > num2)
{
break;
}
if (index < num2)
{
T local2 = keys[index];
keys[index] = keys[num2];
keys[num2] = local2;
if (values != null)
{
TValue local3 = values[index];
values[index] = values[num2];
values[num2] = local3;
}
}
index++;
num2--;
}
while (index <= num2);
if ((num2 - left) <= (right - index))
{
if (left < num2)
{
this.QuickSort<TValue>(keys, values, left, num2, comparer);
}
left = index;
}
else
{
if (index < right)
{
this.QuickSort<TValue>(keys, values, index, right, comparer);
}
right = num2;
}
}
while (left < right);
...全文
164 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
罗博士 2014-06-05
  • 打赏
  • 举报
回复
不能用STL?
dianyancao 2014-06-05
  • 打赏
  • 举报
回复
调试完毕,这样的写法有什么问题吗,哪里需要修改? Header.h
template<class T>
class IComparer
{
public:
	int Compare(T x1,T x2)
	{
		return x1-x2;
	}
};
template<class T,class TValue>
void QuickSort(T* keys, TValue* values, int left, int right, IComparer<TValue> comparer);

template<class T,class TValue>
void QuickSort(T* keys, TValue* values, int left, int right, IComparer<TValue> comparer)
{
    do
    {
        int index = left;
        int num2 = right;

        T y = keys[index + ((num2 - index) >> 1)];
        do
        {
            while (comparer.Compare(values[keys[index]], values[y]) < 0)
            {
                index++;
            }
            while (comparer.Compare(values[y], values[keys[num2]]) < 0)
            {
                num2--;
            }
	        if (index > num2)
			{
				break;
			}
			if (index < num2)
			{
				T local2 = keys[index];
				keys[index] = keys[num2];
				keys[num2] = local2;
			}
			index++;
			num2--;
        } while (index <= num2);
        
		if ((num2 - left) <= (right - index))
        {
            if (left < num2)
            {
                QuickSort(keys, values, left, num2, comparer);
            }
            left = index;
        }
        else
        {
            if (index < right)
            {
                QuickSort(keys, values, index, right, comparer);
            }
            right = num2;
        }
    } while (left < right);
}
Source.cpp
#include <iostream>
#include "header.h"
#include <time.h>

using namespace std;

void FillRandomValue(int* values,int left,int right);
int Random(int a,int b);
void FillIndex(int* keys,int left,int right);
void OutputValuesByIndex(int* keys,int left,int right,int* values);

int main()
{
	const int elementCount=100;

	int* intArray=new int[elementCount];
	int* intArrayIndex=new int[elementCount];
	srand((unsigned)time(NULL));

	FillRandomValue(intArray,0,elementCount-1);
	FillIndex(intArrayIndex,0,elementCount-1);
	IComparer<int> myComparer;

	QuickSort(intArrayIndex,intArray,0,elementCount-1,myComparer);
	OutputValuesByIndex(intArrayIndex,0,elementCount-1,intArray);

	system("PAUSE");
	return 0;
}

void FillRandomValue(int* values,int left,int right)
{
	int i;
	for(i=left;i<=right;++i)
	{
		values[i]=Random(0,200);
	}
}

int Random(int a,int b)
{
    return a+(b-a)*rand()/(RAND_MAX + 1.0);
}

void FillIndex(int* keys,int left,int right)
{
	int i;
	for(i=left;i<=right;++i)
	{
		keys[i]=i;
	}
}

void OutputValuesByIndex(int* keys,int left,int right,int* values)
{
	int i;
	for(i=left;i<=right;++i)
	{
		cout<<values[keys[i]]<<endl;
	}
}
ForestDB 2014-06-04
  • 打赏
  • 举报
回复
抛开compare,其它就是C++代码。
赵4老师 2014-06-04
  • 打赏
  • 举报
回复
模板是语法糖。 语法糖越甜,编译调试查错越苦! 把有限的生命浪费在品尝/品鉴无穷多种的语法糖中,我认为不值当。
  • 打赏
  • 举报
回复
c库中的qsort本就是通用的,支持自定义宽度和比较函数
void qsort(
   void *base,
   size_t num,
   size_t width,
   int (__cdecl *compare )(const void *, const void *) 
);
要封装为C++的模板不会太难(要求是元素宽度相同)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧