Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 寻找一个只有3个可能值的数组的O(N)排序_Java_Sorting - Fatal编程技术网

Java 寻找一个只有3个可能值的数组的O(N)排序

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

如果我添加了第三个值“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.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语句和更多的位置变量。