实现快速排序的算法,并尝试采用不同的方法实现线性的划分过程.
方法一:
选取数组中第一个元素作为阈值,指针从两端向中间移动,直到前面的指针大于到后面的指针,完成一次partition。
int partition(int a[], int l, int r)
{
int temp = a[l];
int i = l;
int j = r;
while (i < j)
{
while (i < j && a[j] >= temp)
{
j--;
}
if (i < j)
{
a[i++] = a[j];
}
while (i < j && a[i] <= temp)
{
i++;
}
if (i < j)
{
a[j--] = a[i];
}
}
a[i] = temp;
return i;
}
方法二:
取最后一个元素的值作为阈值,两个指针都从数组前面开始,一个指向大于阈值的元素,另一个指向小于阈值的元素,当指针走到数组末尾时,将阈值与大指针(指向大于阈值的元素的指针)交换,实现一次partition。
int partition_2(int a[], int l, int r)
{
int temp = a[r];
int t;
int i = l;
int j = l;
while (j < r)
{
if (a[j] < temp)
{
t = a[i];
a[i] = a[j];
a[j] = t;
i++;
}
j++;
}
t = a[i];
a[i] = temp;
a[r] = t;
return i;
}
快速排序:
void quiksort(int a[], int l, int r)
{
if (l < r)
{
//int pos = partition_2(a, l, r);
int pos = partition(a, l, r);
quiksort(a, l, pos - 1);
quiksort(a, pos + 1, r);
}
}