您的位置:首页 > 其它

快速排序

2013-10-06 10:30 316 查看
前阵子参加了一个面试,被问到假设有一个数组

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();
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: