算法导论学习笔记(一)排序算法之快速排序
2016-03-07 22:11
429 查看
快速排序算法用到了分治的思想,将大数组分为两个小数组,且使得一个小数组均比某个数小,而另一个小数组均比这个数大,然后将这两个小数组继续划分,直至不可再分。
j为当前被排序数的下标,i指向最后一个比标准数小的数;
即在前j-p个数中,有p-i-1个数比标准数小。
当某个数比标准数小时,与A[i]交换,则将大数置后,而将小数置前;
最后因为A[i]
算导的伪代码
PARTITION(A,p,r) 1 x = A[r] 2 i = p - 1 3 for j = p to r-1 4 if A[j] <= x 5 i = i + 1 6 exchange A[i] with A[j] 7 exchange A[i+1] with A[r] 8 return i + 1
j为当前被排序数的下标,i指向最后一个比标准数小的数;
即在前j-p个数中,有p-i-1个数比标准数小。
当某个数比标准数小时,与A[i]交换,则将大数置后,而将小数置前;
最后因为A[i]
算法分析
快速排序在最好情况下,时间复杂度为O(n lg n),而在最坏情况下,时间复杂度为O(n•n),但是其期望时间复杂度为O(n lg n)。虽然快速排序在一定情况下比分治排序满,但它有一个优点:快速排序为原址排序。当内存不够用的时候,快速排序仍可以稳定的运行;而分治排序需要申请更多的内存空间,才能稳定运行。部分代码
void exchange(int *x,int *y) { if((*x) != (*y)){ (*x)^=(*y); (*y)^=(*x); (*x)^=(*y); } } int partition(int *sortArray,int left,int right) { int i = left - 1; for(int j = left; j < right; ++j){ if(sortArray[j] <= sortArray[right]){ i++; exchange(&sortArray[i],&sortArray[j]); } } exchange(&sortArray[i+1],&sortArray[right]); return i+1; } void quickSort(int *sortArray,int left,int right) { if(left<right){ int q = partition(sortArray,left,right); quickSort(sortArray,left,q-1); quickSort(sortArray,q+1,right); } }
相关文章推荐