Java 寻找一个只有3个可能值的数组的O(N)排序
如果我添加了第三个值“C”,我将尝试扩展以下代码来对数组进行排序。在只保留一个循环的情况下是否可以这样做。下面的代码将使用两个可能的值“A”和“B”对数组进行排序Java 寻找一个只有3个可能值的数组的O(N)排序,java,sorting,Java,Sorting,如果我添加了第三个值“C”,我将尝试扩展以下代码来对数组进行排序。在只保留一个循环的情况下是否可以这样做。下面的代码将使用两个可能的值“A”和“B”对数组进行排序 public class TestSort { public static void main(String args[]) { char f[] = {'A','B','B','A','B','B','A','B','A','A','B'}; int k = 0, t = f.leng
public class TestSort
{
public static void main(String args[])
{
char f[] = {'A','B','B','A','B','B','A','B','A','A','B'};
int k = 0, t = f.length-1;
while(k < t)
{
if(f[k] == 'A')
k = k + 1;
else if(f[k] == 'B')
{
char m = f[t];
f[t] = f[k];
f[k] = m;
t = t - 1;
}
}
System.out.print("\nSorted List\n");
for(char i : f)
System.out.print(i + ", ");
System.out.println();
}
}
可能是这样的:
public sort(char[] array) {
int[] frequencies = new int[3];
for(char c : array) {
if (c == 'A')
frequencies[0]++;
if (c == 'B')
frequencies[1]++;
if (c == 'C')
frequencies[2]++;
}
int index = 0;
for (int i = 0; i < frequencies[0]; i++) {
array[index++] = 'A';
}
for (int i = 0; i < frequencies[1]; i++) {
array[index++] = 'B';
}
for (int i = 0; i < frequencies[2]; i++) {
array[index++] = 'C';
}
}
公共排序(char[]数组){
int[]频率=新int[3];
for(字符c:数组){
如果(c=='A')
频率[0]++;
如果(c=='B')
频率[1]++;
如果(c=='c')
频率[2]++;
}
int指数=0;
对于(int i=0;i<频率[0];i++){
数组[index++]='A';
}
对于(int i=0;i<频率[1];i++){
数组[index++]='B';
}
对于(int i=0;i<频率[2];i++){
数组[index++]='C';
}
}
可能类似于:
public sort(char[] array) {
int[] frequencies = new int[3];
for(char c : array) {
if (c == 'A')
frequencies[0]++;
if (c == 'B')
frequencies[1]++;
if (c == 'C')
frequencies[2]++;
}
int index = 0;
for (int i = 0; i < frequencies[0]; i++) {
array[index++] = 'A';
}
for (int i = 0; i < frequencies[1]; i++) {
array[index++] = 'B';
}
for (int i = 0; i < frequencies[2]; i++) {
array[index++] = 'C';
}
}
公共排序(char[]数组){
int[]频率=新int[3];
for(字符c:数组){
如果(c=='A')
频率[0]++;
如果(c=='B')
频率[1]++;
如果(c=='c')
频率[2]++;
}
int指数=0;
对于(int i=0;i<频率[0];i++){
数组[index++]='A';
}
对于(int i=0;i<频率[1];i++){
数组[index++]='B';
}
对于(int i=0;i<频率[2];i++){
数组[index++]='C';
}
}
要求是“保持O(n)”还是“保持一个循环”
添加第二个(非嵌套)循环不会改变O(n)质量。然后你可以分两步完成:第一步将所有的“A”推到起点,第二步将所有的“C”推到终点。要求是“保持O(n)”,还是“保持一个循环”
添加第二个(非嵌套)循环不会改变O(n)质量。然后你可以分两步完成:第一步将所有的“A”推到起点,第二步将所有的“C”推到终点。A、B和C的数量是否一样多?在stackoverflow上搜索荷兰国旗时发现:(和其他)。A、B和C的频率未知,数组长度未知。计数排序!计数排序!计数排序!A和B的数量和C的数量一样吗?在stackoverflow上搜索荷兰国旗时发现:(和其他)。A、B和C的频率未知,数组长度未知。计数排序!计数排序!计数排序!如果你要存储频率,你应该像array[frequencies[i]+]=C;然后一次就可以完成loop@Ben:不,您需要首先计算整个数组,然后输出结果。如果要存储频率,您应该执行类似于array[frequencies[i]+]=C;然后一次就可以完成loop@Ben:否,您需要首先计算整个阵列,然后输出结果。目标是保持它与我在while循环中给出的示例代码相同,只是可能有更多的if语句和更多的位置变量。目标是保持它与我在while循环中给出的示例代码相同,只是可能有更多的if语句和更多的位置变量。