基本思想
每趟使表的第1个元素放入适当位置(归位),并且左边的元素小于这个元素,右面的元素大于这个元素,将表一分为二,对子表按递归方式继续这种划分,直至划分的子表长为0或1(递归出口)。
快速排序递归树
算法代码
1 void QuickSort(int *arr,int left,int right) 2 { 3 int l = left; 4 int r = right; 5 int temp = arr[left]; //基准值 6 if(l<r) //第一次传参判断有效性 7 { 8 while (l!=r) 9 { 10 while (l<r&&arr[r]>=temp) 11 { 12 r--; 13 } 14 arr[l] = arr[r]; 15 while(l<r&&arr[l]<=temp) 16 { 17 l++; 18 } 19 arr[r] = arr[l]; 20 } 21 arr[l] = temp; 22 QuickSort(arr, left, l - 1); 23 QuickSort(arr, l + 1, right); 24 } 25 }
算法分析
最好情况:
此时时间复杂度为O(nlog2n),空间复杂度为O(log2n)。
最坏情况:
此时时间复杂度为O(n2),空间复杂度为O(n)。
平均情况:
结论: 快速排序的平均时间复杂度为O(nlog2n) 。
平均所需栈空间为O(log2n)。