快速排序---qsort,是一种性能十分优越的排序,大多数情况下,时间复杂度为o(N*logN);
第一种实现方式:前后法
要点: 控制好边界;cur 去找比 a[key] 小的数,找到了 就将prev++,在进行交换;没找到,cur++;
void QsortPart(int*a,int left,int right)
{
//left 为左边界 right 为有边界
int key = left;
int prev = left; // key,prev,cur 都为下标
int cur = cur+1; // a[cur] 找比 a[key] 小的数字
while(cur<=right)
{
if(a[cur] < a[key])
{
prev++;
Swap(&a[cur],&a[prev]); // 将比 a[key] 小的数字和 a[prev] 进行交换
}
cur++;
}
// 再将 key 和 prev 进行交换 即完成了第一次排序
Swap(&a[cur],&a[prev]); //此时 比a[key]小的 在 key的前面 大于等于key的在key的后面
}
第二种方式 :挖坑法
要点:begin++ 找大 ,end-- 找小 ,任何一个找到了,就和坑进行交换,并更新坑的位置;
注意边界 begin < end;
void QsortPast2(int* a,int left,int right)
{
int begin = left;
int end = right;
int key = a[left];
int hole = left; //坑
while(begin < end)
{
while(a[end] > key && begin < end)
{
end--;
}
swap(&a[end],&a[hole]);
hole = end; //新坑
while(a[begin] < key && begin < end)
{
begin++;
}
swap(&a[begin],&a[hole]);
hole = begin; //新坑
}
swap(&a[begin],&a[hole]);
}
第三种方法:左右法
要点:左边找大,右边找小,找到了 就交换,当begin和end相遇时 ,将任一个和key相交换;
void QsortPast3(int* ,int left,int right)
{
int begin = left;
int end = right;
int key = left;
while(begin < end)
{
while(begin < end && a[end] >= a[key])
{
end--; //找小
}
while(begin < end && a[begin] <= a[key])
{
begin++; //找大
}
//找到了 交换
Swap(&a[begin],&a[end]);
}
// begin 和 end 相遇,任一个和key交换
Swap(&a[begin],&a[key]);
}