问题描述
给定一个数组arr,和一个数num,请把小于num的数放在数组的左边,大于num的数放在数组的右边。
要求额外空间复杂度O(1),时间复杂度O(N)
#include <iostream>
using namespace std;
const int N = 100010;
int Arr[N];
void Sort(int *p, int nStart, int nEnd);
int main(int argc, char** argv)
{
int nLen;
scanf("%d",&nLen);
for(int i = 0; i < nLen; i++)
{
scanf("%d",&Arr[i]);
}
Sort(Arr, 0, nLen-1);
for(int i = 0; i < nLen; i++)
{
printf("%d ",Arr[i]);
}
printf("\n");
return 0;
}
void Sort(int *p, int nStart, int nEnd)
{
int nMid = (nEnd-nStart)/2 + nStart;
int nFlag = p[nMid];
int l = nStart-1; int r = nEnd+1;
while(l < r)
{
do
{
l++;
}while(Arr[l] < nFlag);
do
{
r--;
}while(Arr[r] > nFlag);
if(l < r)
{
swap(Arr[l], Arr[r]);
}
}
}