快排的递归写法,思路大致如下:给定一组数据,标记头和尾,然后定义一个变量key,初始化为第一个值,
从尾部开始,若其比key大,则尾部向前移动,若其小于key则和头位置交换数据,
然后从头部开始,若其值小于key,则头部向后移动,若其值大于key则将其值赋给尾部 依次循环,直到头部等于尾部,结束退出。这也被称为快排的第一次划分。
划分函数代码如下:
int Partition(int *arr, int left, int right)
{
int i = left;
int j = right;
int tmp = arr[i];
while ( i < j)
{
while (i < j && arr[j] > tmp)
--j;
if (i < j)
{
arr[i] = arr[j];
}
while (i < j && arr[i] <= tmp)
++i;
if (i < j)
{
arr[j] = arr[i];
}
}
arr[i] = tmp;
return i;
}
快排递归代码如下:
void QuickSort(int *arr, int left, int right)
{
if (left < right)
{
int mid = Partition(arr, left, right);
QuickSort(arr, left, mid - 1);
QuickSort(arr, mid + 1, right);
}
}
测试用例:
int main()
{
int arr[] = { 12, 34, 56, 89, 67, 23, 45, 90, 78, 100 };
int len = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i <= len - 1; i++)
{
printf("%d ", arr[i]);
}
PassQuick(arr, 0, len - 1);
printf("\n");
for (int i = 0; i <= len - 1; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
测试结果:
快排非递归写法:后续。