没有元素间的交换操作;
基本操作:填坑(赋值运算);
快速排序用到递归思想;
快排法,是改进后的冒泡排序法
一趟排序后,把集合分成左右两个子集合,基准数左边元素的称之为小集合,右边元素称之为大集合。
从图中描述的一趟排序过程可以看出,期间数组存在脏数据--坑,排序过程称之为填坑过程。
代码实现:
/**
* 快速排序,由小到大
*/
public static int[] sortBy(int[] ints) {
sortBy(ints, 0, ints.length - 1);
return ints;
}
private static void sortBy(int[] ints, int lo, int li) {
if (lo >= li) {
return;
}
//选取最左边的元素为基准数
int baseElement = ints[lo];
int left = lo, right = li;
/**一趟排序完成结束循环*/
while (lo < li) {
//由右向左扫描,找到小于基准数的元素
while (li > lo) {
if (ints[li] < baseElement) {
break;
}
li--;
}
if (li > lo) {
ints[lo++] = ints[li];
}
//由左向右扫描,找到大于基准数的元素
while (li > lo) {
if (ints[lo] > baseElement) {
break;
}
lo++;
}
if (li > lo) {
ints[li--] = ints[lo];
}
}
ints[lo] = baseElement;
sortBy(ints, left, lo - 1);
sortBy(ints, lo + 1, right);
}
时间复杂度: