/*
问题描述:输入一个数组A,以及下标i,要求函数将数组元素进行调整,使得所有比A[i]小的元素排在前面,接着是所有等于A[i]的元素,最后排列的是所有大于A[i]的元素,要求算法的空间复杂度为O(1),时间复杂度为O(n)
来源:网易算法课
作者:syt
日期:2017-9-19
思路:第一步,调整数组分成,小于A[i]和大于A[i]两部分。第二步,调整数组为等于A[i]和大于A[i]两部分,两次都是遍历一遍数组,时间复杂度为O(n),空间复杂度为O(1)
问题描述:输入一个数组A,以及下标i,要求函数将数组元素进行调整,使得所有比A[i]小的元素排在前面,接着是所有等于A[i]的元素,最后排列的是所有大于A[i]的元素,要求算法的空间复杂度为O(1),时间复杂度为O(n)
来源:网易算法课
作者:syt
日期:2017-9-19
思路:第一步,调整数组分成,小于A[i]和大于A[i]两部分。第二步,调整数组为等于A[i]和大于A[i]两部分,两次都是遍历一遍数组,时间复杂度为O(n),空间复杂度为O(1)
*/
#include <iostream>
using namespace std;
void reArrangeArray(int A[], int goal, int begin, int end, bool isEqual)
{
while (begin < end)
{
if ((isEqual && A[begin] >= goal ) || (!isEqual && A[begin] > goal))
{
int tmp = A[begin];
A[begin] = A[end];
A[end] = tmp;
end--;
}
else
{
begin++;
}
}
}
void main()
{
int A[] = { 6, 5, 5, 7, 9, 4, 3, 3, 4, 6, 8, 4, 7, 9, 2, 1 };
int length = sizeof(A) / sizeof(A[0]);
int i = 5;
int tmp = A[i];
reArrangeArray(A, tmp, 0, length - 1, true);
int index = 0;
for (int j = 0; j < length; j++)
{
if (A[j] == A[i])
{
index = j;
break;
}
}
reArrangeArray(A, tmp, index, length - 1, false);
for (int j = 0; j < length; j++)
cout << A[j] << " ";
cout << endl;
}