一种排序

来源:互联网 发布:魏强斌 知乎 编辑:程序博客网 时间:2024/05/20 12:21

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=8


  由于刚开始做题,刚开始学习数据结构(之前上课没好好学),好多都没有学到,本题中只运用了ArrayList,代码很长,如果能运用其他数据结构以及算法,肯定会有更快速简介的代码。

 import java.util.ArrayList;import java.util.Scanner;public class Main {    public static void main(String[] args) {        // TODO ?????????        quicksort qs = new quicksort();        Scanner sc = new Scanner(System.in);        ArrayList<Integer> list = new ArrayList<Integer>();        int n = sc.nextInt();        while (n-- > 0) {            int m = sc.nextInt();            int m1 = m;            int[][] array1 = new int[m][3];            int[][] array2 = new int[m][3];            int[][] array3 = new int[m][3];            int[][] array4 = new int[m][3];            int[] data1 = new int[m];            int[] data2 = new int[m];            int[] data3 = new int[m];            int[] flag1 = new int[m];            int[] flag2 = new int[m];            int[] flag3 = new int[m];            int count = 0;            for (int i = 0; i < m1; i++) {                flag1[i] = 0;                flag2[i] = 0;                flag3[i] = 0;            }            while (m-- != 0) {                int id = sc.nextInt();                int length = sc.nextInt();                int width = sc.nextInt();                array1[count][0] = id;                array1[count][1] = length;                array1[count][2] = width;                data1[count] = id;                count++;            }            //长宽置换            for (int i = 0; i < m1; i++) {                int tmp;                if (array1[i][1] < array1[i][2]) {                    tmp = array1[i][1];                    array1[i][1] = array1[i][2];                    array1[i][2] = tmp;                }            }            // 第一次排序            qs.data = data1;            qs.sort(0, qs.data.length - 1);            data1 = qs.data;            for (int i = 0; i < m1; i++) {                for (int j = 0; j < m1; j++) {                    if ((data1[i] == array1[j][0]) && (flag1[j] == 0)) {                        array2[i][0] = array1[j][0];                        array2[i][1] = array1[j][1];                        array2[i][2] = array1[j][2];                        flag1[j] = 1;                        break;                    }                }            }            // 第二次排序            for (int i = 0; i < m1; i++)                data2[i] = array2[i][1];            for (int i = 0; i < m1; i++) {                if ((i != (m1 - 1)) && (data1[i] != data1[i + 1])) {                    array3[i][0] = array2[i][0];                    array3[i][1] = array2[i][1];                    array3[i][2] = array2[i][2];                } else if (i == (m1 - 1)) {                    array3[i][0] = array2[i][0];                    array3[i][1] = array2[i][1];                    array3[i][2] = array2[i][2];                }                else if ((i != (m1 - 1)) && (data1[i] == data1[i + 1])) {                    int k = i;                    while ((i != (m1 - 1)) && (data1[i] == data1[i + 1]))                        i++;                    qs.data = data2;                    qs.sort(k, i);                    data2 = qs.data;                    for (int i1 = k; i1 <= i; i1++) {                        for (int j = k; j <= i; j++) {                            if ((data2[i1] == array2[j][1]) && (flag2[j] == 0)) {                                array3[i1][0] = array2[j][0];                                array3[i1][1] = array2[j][1];                                array3[i1][2] = array2[j][2];                                flag2[j] = 1;                                break;                            }                        }                    }                }            }            //第三次排序            for (int i = 0; i < m1; i++)                data3[i] = array3[i][2];            for (int i = 0; i < m1; i++) {                if (i == (m1 - 1)) {                    array4[i][0] = array3[i][0];                    array4[i][1] = array3[i][1];                    array4[i][2] = array3[i][2];                }                else if ((i != (m1 - 1)) &&                        ((array3[i][0] != array3[i + 1][0]) ||                        (array3[i][1] != array3[i + 1][1]))) {                    array4[i][0] = array3[i][0];                    array4[i][1] = array3[i][1];                    array4[i][2] = array3[i][2];                }                else if ((i != (m1 - 1)) &&                        ((array3[i][0] == array3[i + 1][0]) &&                        (array3[i][1] == array3[i + 1][1]))) {                    int k = i;                    while ((i != (m1 - 1)) &&                            (array3[i][0] == array3[i + 1][0]) &&                            (array3[i][1] == array3[i + 1][1]))                        i++;                    qs.data = data3;                    qs.sort(k, i);                    data3 = qs.data;                    for (int i1 = k; i1 <= i; i1++) {                        for (int j = k; j <= i; j++) {                            if ((data3[i1] == array3[j][2]) && (flag3[j] == 0)) {                                array4[i1][0] = array3[j][0];                                array4[i1][1] = array3[j][1];                                array4[i1][2] = array3[j][2];                                flag3[j] = 1;                                break;                            }                        }                    }                }            }            //消除相同列并放入ArrayList中            for (int i = 0; i < m1; i++) {                if ((i != (m1 - 1)) &&                        ((array4[i][0] != array4[i + 1][0]) ||                        (array4[i][1] != array4[i + 1][1]) ||                        (array4[i][2] != array4[i + 1][2]))) {                    list.add(array4[i][0]);                    list.add(array4[i][1]);                    list.add(array4[i][2]);                }                if (i == (m1 - 1)) {                    list.add(array4[i][0]);                    list.add(array4[i][1]);                    list.add(array4[i][2]);                    break;                }            }            //按格式输出            for (int i = 0; i < (list.size() - 1); i++) {                System.out.print(list.get(i));                System.out.print(" ");                System.out.print(list.get(i + 1));                System.out.print(" ");                System.out.println(list.get(i + 2));                i = i + 2;            }            list.clear();        }    }}//快速排序class quicksort {    public int[] data;    private int partition(int[] sortArray, int low, int hight) {        int key = sortArray[low];        while (low < hight) {            while ((low < hight) && (sortArray[hight] >= key))                hight--;            sortArray[low] = sortArray[hight];            while ((low < hight) && (sortArray[low] <= key))                low++;            sortArray[hight] = sortArray[low];        }        sortArray[low] = key;        return low;    }    public void sort(int low, int hight) {        if (low < hight) {            int result = partition(data, low, hight);            sort(low, result - 1);            sort(result + 1, hight);        }    }    public void display() {        for (int i = 0; i < data.length; i++) {            System.out.print(data[i]);            System.out.print(" ");        }    }}


                                             
0 0
原创粉丝点击