环境:Visual Studio 2019
#include<stdio.h>
void func(int arr[], int length)
{
if (length < 2)
return;//小于两个元素不需要排序。
int t = arr[0];//选取最左边的数作为中心轴。
int left = 0;//左下标。
int right = length - 1;//右下标。
int flag = 2;//当前应该移动的下标:1-左下标,2-右下标。
while (left < right)
{
if (flag == 2)//移动右下标的情况。
{
//如果右下标位置元素的值大于等于中心轴,继续移动右下标。
if (arr[right] > t)
{
right--;
continue;
}
//如果右下标位置元素的值小于中心轴,把它填到左下标的坑中。
arr[left] = arr[right];
left++;//左下标向右移动。
flag = 1;//下次循环将移动左下标。
continue;
}
if (flag == 1)//移动左下标的情况。
{
//如果左下标位置元素的值大于等于中心轴,继续移动左下标。
if (arr[left] < t)
{
left++;
continue;
}
//如果左下标位置元素的值小于中心轴,把它填到右下标的坑中。
arr[left] = arr[right];
right--;//右下标向右移动。
flag = 2;//下次循环将移动右下标。
continue;
}
}
//如果循环结束,左右下标重合,把中心轴的值填进去。
arr[left] = t;
func(arr, left);
func(arr + left + 1, length - left - 1);
}
int main()
{
int a[100];
int len = 0;
scanf_s("%d", &len);
for (int i = 0; i < len; i++)
{
scanf_s("%d", &a[i]);
}
func(a, len);
for (int j = 0; j < len; j++)
{
printf("%d", a[j]);
if (j <= len - 1)
printf(" ");
}
printf("\n");
return 0;
}