//手写数组快排函数
#include<bits/stdc++.h>
using namespace std;
template<typename T>
bool cmp(T a,T b);
template<typename T>
void swap(T *a,T *b);
template<typename T>
void my_sqrt(T list[],const int length,bool (*cmp)(T,T));
template<typename T>
void show(const T list[],const int length);
int main()
{
const int list_length(6);
int a[list_length]{3,5,6,2,8,1};
float b[list_length]{5.0,7.0,4.0,3.3,3.2,9.9};
my_sqrt(a,list_length,cmp);
show(a,list_length);
my_sqrt(b,list_length,cmp);
show(b,list_length);
return 0;
}
//比较函数
template<typename T>
bool cmp(T a,T b)
{
return a<b;
}
//交换函数
template<typename T>
void swap(T *a,T *b)
{
T tmpt;
tmpt=*a;
*a=*b;
*b=tmpt;
}
//快排函数
template<typename T>
void my_sqrt(T list[],int length,bool (*cmp)(T,T))
{
int l(0);
T tmpt(list[l]);
int right(length-1);
int r(length-1);
if(l>=r) return;
while(l!=r)
{
//找第一个小于tmpt ,即当tmpt小于list[r]时则循环
while(l<r&&(((*cmp)(tmpt,list[r]))||list[r]==tmpt))
{
r--;
}
//找第一个大于tmpt ,即当list[l]小于tmpt时则循环
while(l<r&&(((*cmp)(list[l],tmpt))||list[l]==tmpt))
{
l++;
}
//把右边小于tmpt的和左边大于tmpt的交换
if(l<r) swap(list+l,list+r);
}
//交换list[l]和基准tmpt
*list=list[l];
list[l]=tmpt;
//递归
my_sqrt(list,l+1,cmp);
my_sqrt(list+l+1,right-l,cmp);
}
//展示函数
template<typename T>
void show(const T list[],const int length)
{
for(int i=0;i<length;i++)
{
cout<<list[i]<<" ";
}
cout<<endl;
}
快排函数_记录
最新推荐文章于 2023-12-21 22:34:24 发布