今天我们一共介绍三种关于快排的方法:
一:hoare版本
思路:
首先选出一个key(一般为最右边或者最做左边的数),左右分别有两个指针,右边找比key小的数,左边紧随其后找比key大的数,谁先找到的话先停下,同时找到就交换二者的位置,然后二者相遇时就将相遇的值重新定义为key,即交换其与key的位置,单趟结束时,左边均为比key小的值,右边均为比key大的值
光从思路入手,相信许多小伙伴第一次写的代码是这样的:
void quicksort(int *a ,size_t size)
{
int left = 0;
int right = size-1;
int key = a[left];
while (left<right)
{
while (a[right] > key)
{
right--;
}
while (a[left] < key)
{
left++;
}
Swap(&a[left], &a[right]);
}
}
但这种代码会导致死循环,假设左右值均与key相同的话,哪么二者就会不停的交换从而导致死循环,在这里我们做一些小优化: