使用Java中的队列合并排序

时间:2017-05-03 05:44:18

标签: java arrays queue mergesort

public class NumberQueue {
    private int firstLoc=0;
    private int lastLoc=0;
    private int[] numArray = new int[MAXSIZE]; 
    public static final int MAXSIZE=100;

    public int getQsize() { 
        return (MAXSIZE+lastLoc-firstLoc) % MAXSIZE;
    }

    public boolean fullCheck() { 
        return (getQsize() == MAXSIZE-1);
    }

    public boolean emptyCheck() { 
        return (firstLoc == lastLoc); 
    }

    public int getValue(int loc) { 
        return numArray[loc];
    }   

    public int front() {
        return numArray[firstLoc]; 
    }

    public void remove() { 
        if (!emptyCheck()) 
            firstLoc = (firstLoc + 1) % MAXSIZE;
    }

    public int insert(int val) {
        if (fullCheck()) {
            return -1;
        } else {
          numArray[lastLoc] = val;
          lastLoc = (lastLoc +1) % MAXSIZE;
          return 0;
        }
    }

    public void display() {
        int i = firstLoc;
        while(i < lastLoc) {
            System.out.print(numArray[i]+" ");
            i++;
        }
        System.out.println();
    }   
}


public class NumberQueueMain {
  public static void main(String[] args) {

    //Create three queues
    NumberQueue S1 = new NumberQueue();
    NumberQueue S2 = new NumberQueue();
    NumberQueue S3 = new NumberQueue();

    //Get the array of queues       
    Scanner S = new Scanner(System.in);
    System.out.println("Enter a series of number with a space between each value: ");       
    String str = S.nextLine();
    String[] arr = str.split(" ");
    int array[] = new int[arr.length];
    for(int i = 0; i < arr.length; i++) {
        array[i] = Integer.parseInt(arr[i]);
    }

    //Put the array into the NumberQueues-S1.
    for(int i = 0; i < arr.length; i++) {
        S1.insert(array[i]);
    }

    //Merge Sort S1 
    int loc = -1;
    while(loc < (S1.getQsize()-1)) {
        do {
            S2.insert(S1.front());       
            S1.remove();                
            loc++;
        } while(S1.getValue(loc) < S1.getValue(loc+1) && loc < S1.getQsize()-1);
        S2.display(); 

        while(loc < S1.getQsize()-1) {
            do{
                S3.insert(S1.front());
                S1.remove();
                loc++;
        } while(S1.getValue(loc) < S1.getValue(loc+1) && loc < S1.getQsize()-1);
            S3.display();
        }

        while(!S2.emptyCheck() && !S3.emptyCheck()) {
            if(S2.front() > S3.front()) {
                S1.insert(S3.front());
                S3.remove();        
            } else if(S2.front()==S3.front()) {
                S1.insert(S2.front());
                S1.insert(S3.front());
                S2.remove();
                S3.remove();
            } else {
                S1.insert(S2.front());
                S2.remove();
            }
        }

        if (S2.emptyCheck()){
            int sizeS3 = S3.getQsize();
            for(int i = 0;i < sizeS3; i++){
                S1.insert(S3.front());
                S3.remove();
            }
        } else if(S3.emptyCheck()){
            int sizeS2 = S2.getQsize();
            for(int i = 0;i < sizeS2; i++) {
                S1.insert(S2.front());
                S2.remove();
            }
        }
    } 
    System.out.println();
    S1.display();
  }

}

输出

  

输入一系列数字,每个值之间有一个空格:3 5 7 2 3 5   11 34 12 10 15 18 3 12 17 22 12 18 25 22 30 3 5 7 2 3 5 11 34 2 3 5   11 34 12 2 3 5 11 34 12 10 15 18 3 12 17 22 12 18 25 22 30

     

2 3 3 5 5 7 11 34 12 10 15 3 12 17 18 22 12 18 25 22 30

问题:
为什么它只对彼此相邻的两个队列进行排序,只做一次。我找不到解决它的地方。请帮助我!

1 个答案:

答案 0 :(得分:0)

您的代码中存在很多问题。但是首先考虑第一个问题,你没有处理所有数据的原因是以下行中的错误:

while(loc < (S1.getQsize()-1))

以下块中的代码会从S1中删除项目,因此每次迭代时大小都会减少。

您可以通过以下方式解决此问题:

int size = S1.getQsize();
while (loc < size - 1)

或(更好)

while (!S1.emptyCheck)

但是,即使您处理所有输入数据,排序算法仍然存在错误。也许你可以解决这个问题,进一步调查,如果你遇到问题,可以回过头来回答一个问题。