思想:将一个数组选第一个元素作为基准元素pivot,然后先从右向左遍历,找到比pivot小的元素a[小]后赋值给左边第一个元素a[左],然后从左向右依次遍历找到比pivot大的元素a[大],然后放到刚刚a[小]的位置,这时,大的放到了右边,小的放到了左边,再将pivot的值赋值给a[大],这样就完成了依次以pivot为基准,左边的元素比pivot小右边比pivot大的排序。然后再用这个方法分别对左右的子数组进行排序,以此类推。。。
java代码
public static void quick_sort(int[] a,int L,int R){
if (L>=R)return;
int i = L, j=R, pivot = a[L]; //左边第一个元素作为基准元素
while (i<j){
//从左向右遍历,找到比基准小的元素
while (i<j && a[j]>=pivot) j--;
//找到比左边第一个小的元素,赋值
a[i] = a[j];
System.out.println("a[" + i + "]:" + a[i]);
//从右向左遍历,找到比基准大的元素
while (i<j && a[i] <= pivot)i++;
a[j] = a[i];
//完成依次循环,将比基准大的元素放到了j,比基准小的元素放到了i
System.out.println("a[" + j + "]:" + a[j] );
}
a[i] = pivot;
System.out.println("a[" + i + "]:" + a[i]);
System.out.println(Arrays.toString(a));
quick_sort(a,L,i-1);
// System.out.println("左边数组排序:"+Arrays.toString(a));
quick_sort(a,i+1,R);
// System.out.println("右边数组排序:"+Arrays.toString(a));
}
public static void main(String[] args) {
quick_sort(new int[]{3, 5, 2, 1, 8, 0, 6},0,6);
}
打印结果
a[0]:0
a[5]:5
a[1]:1
a[3]:1
a[3]:3
[0, 1, 2, 3, 8, 5, 6]
a[0]:0
a[0]:0
a[0]:0
[0, 1, 2, 3, 8, 5, 6]
a[1]:1
a[1]:1
a[1]:1
[0, 1, 2, 3, 8, 5, 6]
a[4]:6
a[6]:6
a[6]:8
[0, 1, 2, 3, 6, 5, 8]
a[4]:5
a[5]:5
a[5]:6
[0, 1, 2, 3, 5, 6, 8]
平均时间复杂度:O(nlog₂n)
最坏时间复杂度:O(n²)
最好时间复杂度:O(nlog₂n)
空间复杂度: O(log₂n)
稳定性: 不稳定