快排的递归实现
partition的几种实现
第一个用首元素划分
第二个用尾元素划分
/*1. 使用while的partion*/
int partition2(vector<int>&vec, int start, int end)
{
int i = start, j = end;
int key = vec[start];
while (i < j)
{
while (i < j&&vec[j] >= key)
j--;
if (i < j)
vec[i++] = vec[j];
while (i < j&&vec[i] < key)
i++;
if (i < j)
vec[j--] = vec[i];
}
vec[i] = key;
return i;
}
/*2. 使用for的partion*/
int partition1(vector<int>&vec, int start, int end)
{
int key = vec[end];
int small = start - 1;
for (int i = start; i < end; i++)
{
if (vec[i] < vec[end] )
{
small++;
swap(vec[small] , vec[i]);
}
}
small++;
swap(vec[small], vec[end]);
return small;
}
快排的解决代码
//结合partition解决
void quickSort(int a[], int p, int r) {
int position = 0;
if (p<r)
{
position = partition(a,p,r);//返回划分元素的最终位置
quickSort(a,p,position-1);//划分左边递归
quickSort(a, position + 1,r);//划分右边递归
}
}
//2.单独解决(为partion和sort的结合体) 可重点背诵
void quick(int a[],int left,int right)
{
if(left>=right)
return;
int i=left,j=right,key=a[left];
while(i<j)
{
while((i<j)&&a[j]>=key)
j--;
if(i<j)
a[i++]=a[j];
while((i<j)&&a[i]<key)
i++;
if(i<j)
a[j--]=a[i];
}
a[i]=key;
quick(a,left,j-1);
quick(a,j+1,right);
}
如果想要性能提升,还可以使用随机作为划分
int partition1(vector<int>&vec, int start, int end)
{
int index = start+rand()%(end-start+1);//元素变化范围在[start,end]
swap(vec[index],vec[end]);
int small = start - 1;
for (int i = start; i < end; i++)
{
if (vec[i] < vec[end] )
{
small++;
swap(vec[small] , vec[i]);
}
}
small++;
swap(vec[small], vec[end]);//此时[start,small-1]是比vec[end]小的
// [small,end-1]全是比vec[end]大的
//交换small和end 即实现左小右大
return small;
}
码字不易 日后还会继续学习 想要与某211的沙雕一起学的话 关注一哈订阅号 <偏执的喵喵> 持续分享一些学习记录与众多电子书籍 想要算法章节上课的ppt也有哦