荷兰国旗问题 数组中的元素,小于e的排在数组左边 等于在中间 大于在右边
/*
* 运行环境 win10 + vs2015
* 结果: 运行正确
* 编者: 倾斜的正弦波
*/
#include "stdafx.h"
#define Maxsize 10
int buffer[Maxsize] = {4, 3, 9, 1, 5, 6, 7, 2, 0, 11};
/*
* 小于e的在数组的左边 大于e的在数组右边
*/
void div(int A[], int e)
{
int low_cnt = -1;
for (int i = 0; i < Maxsize; ++i)
{
if (A[i] < e)
{
int temp = A[low_cnt + 1];
A[low_cnt + 1] = A[i];
A[i] = temp;
++low_cnt;
}
}
}
/*荷兰国旗问题 小于在左边 等于在中间 大于在右边*/
/*相当于数组被划分为了三个区域即 左边区域 中间区域 右边区域*/
void test_1(int A[], int e)
{
int low = -1, high = Maxsize;
int cur = 0, temp = 0;
while (cur < high)
{
/*若当前元素cur小于e时 将当前元素与左边区域的后一个元素交换
* 然后左边区域扩大即low++ cur指向下一个即cur++
*/
if (A[cur] < e)
{
temp = A[low + 1];
A[low + 1] = A[cur];
A[cur] = temp;
++low;
cur++;
}
else if (A[cur] > e)
{
/*若当前元素cur大于e时 将当前元素与右边区域的第一个元素即high-1交换
* 然后右边区域扩大即--high
* cur此时不变(因为交换过来的数是否大于小于e未知,需要再次比较此位置的数)
* cur区别去上面小于的情况要注意!!!
*/
temp = A[high - 1];
A[high - 1] = A[cur];
A[cur] = temp;
--high;
}
else if (A[cur] == e)
{
++cur;//相等当前右边直接到下一个 (相当于等于e的留在中间了)
}
}
}
int main()
{
printf("hello world\n");
//div(buffer, 5);
test_1(buffer, 5);
for (int i = 0; i < Maxsize; i++)
{
printf("%d ", buffer[i]);
}
printf("\n");
return 0;
}