基本思想
基于分治法:在待排序表中任取一个元素作为枢轴(或基准,通常取首元素),通过一趟排序将待排序表划分为独立的两部分和,使得中的所有元素小于 ,中的所有元素大于等于,则放在了其最终位置上,这个过程称为一趟快速排序(或一次划分)。然后分别递归地对两个子表重复上述过程,直至每部分内只有一个元素或空位置,即所有元素放在了其最终位置上。
快速排序
排序算法:
void QuickSort(ElemType A[], int low, int high) {
if (low < high) { //递归跳出的条件
//Partition()就是划分操作,将表A[low...high]划分为满足上述条件的两个子表
int pivotpos = Partition(A, low, high); //划分
QuickSort(A, low, pivotpos - 1); //依次对两个子表进行递归排序
QuickSort(A, pivotpos + 1, high);
}
}
划分操作:
int Partition(ElemType A[], int low, int high) { //一趟划分
ElemType pivot = A[low]; //将当前表中的第一个元素设为枢轴,对表进行划分
while (low < high) { //循环跳出条件
while (low<high && A[high]>=pivot) --high;
A[low] = A[high]; //将比枢轴小的元素移动到左端
while (low < high && A[low] <= pivot) ++low;
A[high] = A[low]; //将比枢轴大的元素移动到右端
}
A[low] = pivot; //枢轴元素存放在最终位置
return low; //返回存放枢轴的最终位置
}
性能分析:
空间效率:快速排序算法需要递归调用,故借助一个栈来实现,其容量为递归调用的最大深度。最好情况:;最坏情况:;平均情况:。
时间效率:最坏情况:,最好情况:。
稳定性:若右端存在两个相同且小于枢轴值的元素,则它们的相对位置会发生变化,故不稳定。
快速排序是所有内部排序算法中平均性能最优的排序算法。