第一周打卡:A-快速排序
实现快速排序算法的关键在于在数组中选择一个数字,接下来把数组中的数字分为两部分,比选择的数字小的数字移动到数组的左边,比选择的数字大的数字移动到数组的右边。一般选择序列的第一个元素。具体实现如下:
public static void quickSort(int[] array, int low, int high) {
if (array == null || low < 0 || high >= array.length) throw new IllegalArgumentException("Invalid Parameters");
int i, j, index, temp;
if (low > high) return;
i = low;
j = high;
//temp为基准位
index = array[low];
while (i < j) {
//先看右边,依次往左递减
while (index <= array[j] && i < j) {
j--;
}
//再看左边,依次往右递增
while (index >= array[i] && i < j) {
i++;
}
//如果满足条件则交换
if (i < j) {
temp = array[j];
array[j] = array[i];
array[i] = temp;
}
}
//最后将基准位与i和j相等位置的数字交换
array[low] = array[i];
array[i] = index;
//递归调用左半数组
quickSort(array, low, j - 1);
//递归调用右半数组
quickSort(array, j + 1, high);
}
public static void main(String[] args) {
int[] array = {10, 7, 2, 4, 7, 62, 3, 4, 2, 1, 19};
quickSort(array, 0, array.length - 1);
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
}
过程示意图如下所示:
快速排序每次的交换是跳跃式的,这样交换的次数就少了,速度也就提高了。当然在最坏的情况下,仍可能是相邻的两个数进行了交换。因此快速排序的最差时间复杂度是O(N^2),平均时间复杂度是O(NlogN)。最差的情况下空间复杂度是O( N ) ,即退化为冒泡排序的情况,最优的情况下空间复杂度是O(logN),即每一次都平分数组的情况。