6-9 Sort Three Distinct Keys(20 分)
Suppose you have an array of N elements, containing three distinct keys, "true", "false", and "maybe". Given an O(N) algorithm to rearrange the list so that all "false" elements precede "maybe" elements, which in turn precede "true" elements. You may use only constant extra space.
Format of functions:
void MySort( ElementType A[], int N );
where ElementType A[] contains the N elements.
Sample program of judge:
#include <stdio.h>
#include <stdlib.h>
typedef enum { true, false, maybe } Keys;
typedef Keys ElementType;
void Read( ElementType A[], int N ); /* details omitted */
void MySort( ElementType A[], int N );
void PrintA( ElementType A[], int N )
{
int i, k;
k = i = 0;
for ( ; i<N && A[i]==false; i++ );
if ( i > k )
printf("false in A[%d]-A[%d]\n", k, i-1);
k = i;
for ( ; i<N && A[i]==maybe; i++ );
if ( i > k )
printf("maybe in A[%d]-A[%d]\n", k, i-1);
k = i;
for ( ; i<N && A[i]==true; i++ );
if ( i > k )
printf("true in A[%d]-A[%d]\n", k, i-1);
if ( i < N )
printf("Wrong Answer\n");
}
int main()
{
int N;
ElementType *A;
scanf("%d", &N);
A = (ElementType *)malloc(N * sizeof(ElementType));
Read( A, N );
MySort( A, N );
PrintA( A, N );
return 0;
}
/* Your function will be put here */
Sample Input:
6
2 2 0 1 0 0
Sample Output:
false in A[0]-A[0]
maybe in A[1]-A[2]
true in A[3]-A[5]void MySort(ElementType A[], int N)
{int i = 0;
int Front = 0;
int Rear = N-1;
ElementType *B = (ElementType*)malloc(N * sizeof(ElementType));
for (i = 0; i < N; i++) {
if (A[i] == false)
B[Front++] = A[i];
if (A[i] == true)
B[Rear--] = A[i];
}
for (i = Front; i <= Rear; i++)
B[i] = maybe;
for (i = 0; i < N; i++)
A[i] = B[i];
free(B);
}
本文介绍了一个线性时间复杂度的算法,用于将包含true、false和maybe三种唯一键值的数组重新排列,使得所有false元素位于maybe元素之前,而maybe元素又位于true元素之前。该算法仅使用常数额外空间。
&spm=1001.2101.3001.5002&articleId=79328192&d=1&t=3&u=6543b74fb9d54c3884724a7691ff2434)
226

被折叠的 条评论
为什么被折叠?



