int quicksort(int array[], int left, int right){
int i = left, j = right, temp;
int pivot = array[(left + right) / 2];
while(i < j) {
while(array[i] < pivot)
i++;
while(array[j] > pivot)
j--;
if(i <= j) {
temp = array[i];
array[i] = array[j];
array[j] = temp;
i++;
j--;
}
}
if(left < j)
quicksort(array, left, j);
if(i < right)
quicksort(array, i, right);
return 0;
}
注意快速排序是通过递归完成的,也就不难理解其运用的思想主要是分治法
同样的,由于使用递归,也就必然要花费一定的空间复杂度,这里栈深最坏情况下为O(n),平均O(logn)
注意快速排序中循环的条件,一定要定准边界防止死循环
比如
if(i <= j) {
temp = array[i];
array[i] = array[j];
array[j] = temp;
i++;
j--;
}
这里必须是i <= j,这是因为如若左右哨兵执行到i = j时,如果i,j不-1,则退出循环时,可能此时i,j的值与进入循环时是一样的,那么在递归的时候可能就会出现死循环
快速排序最坏情况下和bubble sort的时间复杂度是一样的:O(N²)
最好情况是O(nlogn)