33,311
社区成员
发帖
与我相关
我的任务
分享
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);
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;
}
}
void qsort(
void *base,
size_t num,
size_t width,
int (__cdecl *compare )(const void *, const void *)
);
要封装为C++的模板不会太难(要求是元素宽度相同)