平均时间复杂度:尽管快速排序的最坏时间为 O(n^2 ), 但就平均性能而言,它是基于关键字比较的内部排序算法中速度最快的,快速排序亦因此而得名。它的平均时间复杂度为 O(n×lgn)。
空间复杂度:快速排序在系统内部需要一个栈来实现递归。若每次划分较为均匀,则其递归树的高度为 O(lgn), 故递归后所需栈空间为 O(lgn) 。最坏情况下,递归树的高度为 O(n), 所需的栈空间为 O(n) 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | void quick_sort( int b[], int left, int right) //升序(以left为key值设计的) { int i = left + 1 , j = right; int key = b[ left]; if (left >= right) return ; //结束条件 while (1) { while (b [j]> key)j --; //找小于等于key的值,用左边的首个值作为key,保证了j最多只到left,不会越界,也只有在这里才会导致出现i>j while (b [i]< key&&i <j) i++; //找大于等于key的值,这里要保证i<j; // while(b [j]<key)j --; //这样就能逆序排序了 // while(b [i]>key&& i <j) i++; if (i >=j) break ; {swap(& b[i],&b [j])} //这里交换以后,i的位置就是保存的小于等于key的值,j的位置保存的就是大于等于key的值 if (b [i]== key)j --; else i ++; } if (left!=j )swap(& b[left],&b [j]); quick_sort(b ,left, i-1); quick_sort(b ,j+ 1,right ); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | void quick_sort( int b[], int left, int right) //降序(以right为key值设计) { int i = left, j = right-1; int key = b[right]; if (left >= right) return ; while (1) { while (b[i]>key)i++; while (b[j]<key&&i<j)j--; if (i>=j) break ; {swap(&b[i],&b[j]);} if (b[j]==key)i++; else j--; } swap(&b[right],&b[i]); quick_sort(b,left,i-1); quick_sort(b,j+1,right); } void swap( int *a, int *b) { int t=*a; *a=*b; *b=t; return ; } |