荷兰国旗问题与数组:
给定一个数组arr,和一个数num,请把小于num的数放到数组的左边,等于num的数放在数组的中间,将大于Num的数放到数组的右边,额外空间复杂度为O(1),时间复杂度为O(N)
代码实现:
void Partition(int arr[], int L, int R, int num)//判断当前位置的值和比较值的大小
{
int less = L - 1, more = R + 1;
while (L < more)
{
if (arr[L] < num)
{
swap1(arr, ++less, L++); //小于区域的下一个和L交换,L在++
}
else if (arr[L] > num)
{
swap1(arr, --more, L); //把当前值和后面的值交换
}
else
L++;
}
图解代码:
整体实现:
/*
2.荷兰国旗问题与数组:
给定一个数组arr,和一个数num,请把小于num的数放到数组的左边,
等于num的数放在数组的中间,将大于Num的数放到数组的右边,
额外空间复杂度为O(1),时间复杂度为O(N)
*/
#include<iostream>
#include<math.h>
#include<time.h>
using namespace std;
#define max 10
void swap1(int arr[], int l, int r) //交换数组两个位置的值
{
int temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
}
void Partition(int arr[], int L, int R, int num)//判断当前位置的值和比较值的大小
{
int less = L - 1, more = R + 1;
while (L < more)
{
if (arr[L] < num)
{
swap1(arr, ++less, L++); //小于区域的下一个和L交换,L在++
}
else if (arr[L] > num)
{
swap1(arr, --more, L); //把当前值和后面的值交换
}
else
L++;
}
}
/*
int* GenerateRandomARray()
{
int *arr = new int[max];
srand((unsigned int)time(NULL ));//随机种子 :cpp中设置随机种子的常规操作
for (int i = 0; i < max; i++)
{
arr[i] = rand();
}
return arr;
}
*/
int main()
{
int arr[max] = {0,1,2,3,4,5,4,6,1,8};
for (int i = 0; i < max; i++)
{
cout << arr[i] << ' ';
}
cout << endl;
Partition(arr, 0, max-1,4);
for (int i = 0; i < max; i++)
{
cout << arr[i] << ' ';
}
system("pause");
return 0;
}