/* package whatever; // don't place package name! */
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class QuickSort {
public static void quicksort(List<Integer> list, int left, int right) {
int q;
if (right > left) {
q = partition(list, left, right);
// after ‘partition’
// list[left..q-1] ≤ list[q] ≤ list[q+1..right]
quicksort(list, left, q - 1);
quicksort(list, q + 1, right);
}
}
static int partition(List<Integer> list, int left, int right) {
int P = list.get(left);
int i = left;
int j = right + 1;
for (;;) { // infinite for-loop, break to exit
while (list.get(++i) < P)
if (i >= right)
break;
// Now, list[i]≥P
while (list.get(--j) > P)
if (j <= left)
break;
// Now, list[j]≤P
if (i >= j)
break; // break the for-loop
else
// swap(list[i],list[j]);
}
if (j == left)
return j;
// swap (list[left],list[j]);
return j;
}
public static void main
(String[] args
) { List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(-1);
list.add(4);
quicksort(list, 0, 4);
for (int i = 0; i < list.size(); i++) {
System.
out.
println(list.
get(i
)); }
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKCiBjbGFzcyBRdWlja1NvcnQgewoJcHVibGljIHN0YXRpYyB2b2lkIHF1aWNrc29ydChMaXN0PEludGVnZXI+IGxpc3QsIGludCBsZWZ0LCBpbnQgcmlnaHQpIHsKCQlpbnQgcTsKCQlpZiAocmlnaHQgPiBsZWZ0KSB7CgkJCXEgPSBwYXJ0aXRpb24obGlzdCwgbGVmdCwgcmlnaHQpOwoJCQkvLyBhZnRlciDigJhwYXJ0aXRpb27igJkKCQkJLy8gbGlzdFtsZWZ0Li5xLTFdIOKJpCBsaXN0W3FdIOKJpCBsaXN0W3ErMS4ucmlnaHRdCgkJCXF1aWNrc29ydChsaXN0LCBsZWZ0LCBxIC0gMSk7CgkJCXF1aWNrc29ydChsaXN0LCBxICsgMSwgcmlnaHQpOwoJCX0KCX0KCglzdGF0aWMgaW50IHBhcnRpdGlvbihMaXN0PEludGVnZXI+IGxpc3QsIGludCBsZWZ0LCBpbnQgcmlnaHQpIHsKCQlpbnQgUCA9IGxpc3QuZ2V0KGxlZnQpOwoJCWludCBpID0gbGVmdDsKCQlpbnQgaiA9IHJpZ2h0ICsgMTsKCQlmb3IgKDs7KSB7IC8vIGluZmluaXRlIGZvci1sb29wLCBicmVhayB0byBleGl0CgkJCXdoaWxlIChsaXN0LmdldCgrK2kpIDwgUCkKCQkJCWlmIChpID49IHJpZ2h0KQoJCQkJCWJyZWFrOwoJCQkvLyBOb3csIGxpc3RbaV3iiaVQCgkJCXdoaWxlIChsaXN0LmdldCgtLWopID4gUCkKCQkJCWlmIChqIDw9IGxlZnQpCgkJCQkJYnJlYWs7CgkJCS8vIE5vdywgbGlzdFtqXeKJpFAKCQkJaWYgKGkgPj0gaikKCQkJCWJyZWFrOyAvLyBicmVhayB0aGUgZm9yLWxvb3AKCQkJZWxzZQoJCQkJLy8gc3dhcChsaXN0W2ldLGxpc3Rbal0pOwoJCQkJQ29sbGVjdGlvbnMuc3dhcChsaXN0LCBpLCBqKTsKCQl9CgkJaWYgKGogPT0gbGVmdCkKCQkJcmV0dXJuIGo7CgkJLy8gc3dhcCAobGlzdFtsZWZ0XSxsaXN0W2pdKTsKCQlDb2xsZWN0aW9ucy5zd2FwKGxpc3QsIGxlZnQsIGopOwoJCXJldHVybiBqOwoJfQoKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKCQlMaXN0PEludGVnZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CgkJbGlzdC5hZGQoMSk7CgkJbGlzdC5hZGQoMik7CgkJbGlzdC5hZGQoMyk7CgkJbGlzdC5hZGQoLTEpOwoJCWxpc3QuYWRkKDQpOwoJCXF1aWNrc29ydChsaXN0LCAwLCA0KTsKCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKCQkJU3lzdGVtLm91dC5wcmludGxuKGxpc3QuZ2V0KGkpKTsKCQl9Cgl9Cn0=