冒泡法:
/*
//对数组排序
int len=100;
float* arry= new float[len]();
srand((unsigned)time(NULL));
for(int i=0;i<len;i++)
{
arry[i]=rand();
}
Sort(arry,len,true);
delete[] arry;
*/
template<typename T>
void Sort(T* arry,int size,bool Ascending = true)
{
T tVal;
if(Ascending)
{
for(int i=0;i<size-1;i++)
{
for(int j=i+1;j<size;j++)
{
if(arry[i]>arry[j])
{
tVal = arry[i];
arry[i]= arry[j];
arry[j]=tVal;
}
}
}
}
else
{
for(int i=0;i<size-1;i++)
{
for(int j=i+1;j<size;j++)
{
if(arry[i]<arry[j])
{
tVal = arry[i];
arry[i]= arry[j];
arry[j]=tVal;
}
}
}
}
}
快速排序法:
/*
//快速排序法
int len=100;
float* arry= new float[len]();
srand((unsigned)time(NULL));
for(int i=0;i<len;i++)
{
arry[i]=rand();
}
QSort(arry,0,len-1,true);
delete[] arry;
*/
template<typename T>
void QSort(T* arry,int left,int right,bool Ascending = true)
{
int l,r;
T t,m;
l=left;
r=right;
m=arry[(left+right)/2];
if(Ascending)
{
while(l<r)
{
while(arry[l]<m)l++;
while(arry[r]>m)r--;
if(l>=r)break;
t=arry[l];
arry[l]=arry[r];
arry[r]=t;
if(arry[l]!=m)l++;
r--;
}
}
else
{
while(l<r)
{
while(arry[l]>m)l++;
while(arry[r]<m)r--;
if(l>=r)break;
t=arry[l];
arry[l]=arry[r];
arry[r]=t;
if(arry[l]!=m)l++;
r--;
}
}
if(l==r)l++;
if(left<r)QSort(arry,left,r,Ascending);
if(l<right)QSort(arry,l,right,Ascending);
}
两种算法在数据量较小时差异不大,但是如果数据量达到上万条,两者的差异非常大,快速排序法在几毫秒内完成的工作冒泡法需要几十秒甚至更长。
下面列出对快速排序法的一些应用:
1.协同排序
/*
//协同排序,参照数组1对数组1和数组2排序,默认为升序排列
int len=100;
float* arry1= new float[len]();
float* arry2= new float[len]();
srand((unsigned)time(NULL));
for(int i=0;i<len;i++)
{
arry1[i]=rand();
arry2[i]=rand();
}
QConsortSort(arry1,arry2,0,len-1,true);
delete[] arry1;
delete[] arry2;
*/
template<typename TA,typename TB>
void QConsortSort(TA* arry1,TB* arry2,int left,int right,bool Ascending=true)
{
int l,r;
TA ta;
TB tb;
l=left;
r=right;
TA m=arry1[(left+right)/2];
if(Ascending)
{
while(l<r)
{
while(arry1[l]<m)l++;
while(arry1[r]>m)r--;
if(l>=r)break;
ta=arry1[l];
arry1[l]=arry1[r];
arry1[r]=ta;
tb=arry2[l];
arry2[l]=arry2[r];
arry2[r]=tb;
if(arry1[l]!=m)l++;
r--;
}
}
else
{
while(l<r)
{
while(arry1[l]>m)l++;
while(arry1[r]<m)r--;
if(l>=r)break;
ta=arry1[l];
arry1[l]=arry1[r];
arry1[r]=ta;
tb=arry2[l];
arry2[l]=arry2[r];
arry2[r]=tb;
if(arry1[l]!=m)l++;
r--;
}
}
if(l==r)l++;
if(left<r)QConsortSort(arry1,arry2,left,r,Ascending);
if(l<right)QConsortSort(arry1,arry2,l,right,Ascending);
}
2.参照排序
//参照排序,参照数组1,对数组2进行排序
//排序后数组1不发生变化,数组2的顺序改变,使用快速排序法实现
template<typename T>
void QAccordingSort(T* arry1,T* arry2,int size,bool Ascending=true)
{
int* ids = new int[size];
for(int i=0;i<size;i++) ids[i] = i;
QAccordingSort(arry1,ids,arry2,0,size-1,Ascending);
delete[] ids;
}
//参照排序,参照数组1,对数组2进行排序
//排序后数组1不发生变化,数组2的顺序改变,使用快速排序法实现
//tIds是一个为了实现算法而添加的辅助数组,其初始值就是0,1,2...,size-1,用于存储arry1排序后的顺序
template<typename T>
void QAccordingSort(T* arry1,int* tIds,T* arry2,int left,int right,bool Ascending = true)
{
int l,r,t;
T m,tT;
l=left;
r=right;
m=arry1[tIds[(left+right)/2]];
if(Ascending)
{
while(l<r)
{
while(arry1[tIds[l]]<m) l++;
while(arry1[tIds[r]]>m) r--;
if(l>=r) break;
t = tIds[l];
tIds[l] = tIds[r];
tIds[r] = t;
tT = arry2[l];
arry2[l] = arry2[r];
arry2[r] = tT;
if(arry1[tIds[l]]!=m) l++;
r--;
}
}
else
{
while(l<r)
{
while(arry1[tIds[l]]>m) l++;
while(arry1[tIds[r]]<m) r--;
if(l>=r) break;
t = tIds[l];
tIds[l] = tIds[r];
tIds[r] = t;
tT = arry2[l];
arry2[l] = arry2[r];
arry2[r] = tT;
if(arry1[tIds[l]]!=m) l++;
r--;
}
}
if(l==r) l++;
if(left<r) QAccordingSort(arry1,tIds,arry2,left,r,Ascending);
if(l<right) QAccordingSort(arry1,tIds,arry2,l,right,Ascending);
}
3.索引排序
/*
//对数组进行排序,排序结果以数组索引号的方式输出
//使用快速排序法实现
int len=100;
float* arry= new float[len]();
int* ids = new int[len];
srand((unsigned)time(NULL));
for(int i=0;i<len;i++)
{
arry[i]=rand();
ids[i]=i;
}
QIndexSort(arry,ids,0,len-1,true);
delete[] arry;
delete[] ids;
*/
template<typename T>
void QIndexSort(T *tVals,int *tIds,int left,int right,bool Ascending = true)
{
int l,r,t;
T m;
l=left;
r=right;
m=tVals[tIds[(left+right)/2]];
if(Ascending)
{
while(l<r)
{
while(tVals[tIds[l]]<m) l++;
while(tVals[tIds[r]]>m) r--;
if(l>=r) break;
t = tIds[l];
tIds[l] = tIds[r];
tIds[r] = t;
if(tVals[tIds[l]]!=m) l++;
r--;
}
}
else
{
while(l<r)
{
while(tVals[tIds[l]]>m) l++;
while(tVals[tIds[r]]<m) r--;
if(l>=r) break;
t = tIds[l];
tIds[l] = tIds[r];
tIds[r] = t;
if(tVals[tIds[l]]!=m) l++;
r--;
}
}
if(l==r) l++;
if(left<r) QIndexSort(tVals,tIds,left,r,Ascending);
if(l<right) QIndexSort(tVals,tIds,l,right,Ascending);
}