前阵子参加了一个面试,被问到假设有一个数组 

int[] arr = new int[] { 7, 2, 4, 6, 0, 0, 0, 1, 6 };

需要删除数组内小于1的数,限制条件分别有:

Ⅰ 不能采用遍历当前数组,复制符合条件的数字到新开辟数组的方式

Ⅱ 不能采用遍历当前数组,删除不符合条件的数字并把之后数字前移的方式

当时唯一想到便是快速排序的做法,以1为参照,把数组内的数据分开,然后截取,最终发生了两个悲剧的事情:

㈠ 出题人表示不但要分开,还必须保持原顺序

㈡ 竟然忘记快速排序是如何运作

这是一件十分丢人的事情,工作中几乎用不到算法,面试需要时才临时抱佛脚地找点程序看看,到最终害死自己。时至今日,仍然不知道当初的题目应该如何解,虽然被提示使用subList方法。无论如何必须认真复习快速排序,否则这一跤白摔了。

package algorithms.test;

/**
 * 快速排序的测试
 * 
 * @author super
 */
public class QuickSort {
    public int[] arr = new int[] { 7, 2, 4, 6, 0, 0, 0, 1, 6 };

    public int[] sort2(int[] datas, int low, int high) {
        int i = low, j = high, key = datas[low], tmp;
        while (i < j) {
            while (i < j && datas[j] >= key) {
                j--;
            }
            while (i < j && datas[i] < key) {
                i++;
            }
            if (i < j) {
                tmp = datas[i];
                datas[i] = datas[j];
                datas[j] = tmp;
            }
        }
        if (i - low > 0) {
            sort2(datas, low, i);
        }
        if (high - i > 1) {
            sort2(datas, i + 1, high);
        }
        return datas;
    }

    /**
     * 测试主方法
     * 
     * @param args
     */
    public static void main(String args[]) {
        QuickSort q = new QuickSort();
        int[] t = q.arr;
        q.sort2(t, 0, t.length - 1);
        for (int i = 0; i < t.length; i++) {
            System.out.print(t[i] + "\t");
            if ((i + 1) % 10 == 0) {
                System.out.println();
            }
        }
    }
}

 

 posted on 2013-10-06 10:30  hiv  阅读(236)  评论(0编辑  收藏  举报