算法思想:将一个待排序的表L[1...n]中任取一个元素作为枢纽pivot,然后将所有小于pivot的数据放入L[1...k-1],将所有大于pivot的数据放入L[k+1...n],最后将pivot放入k的位置,这样的一次排序叫做“划分”,分别递归的将左右两个表,再次划分直到每一部分只有一个数据或者空位置,即排序完毕
算法表现取决于递归深度,每次划分越均匀,则递归深度越低。每次划分越不均匀,则递归深度越深。
性能:空间复杂度,最好O(n),最坏O(logn)。
时间复杂度:最好O(nlogn),最坏O(n^2),平均O(nlogn)
稳定性:不稳定
表的划分
int Partition(int A[], int low, int high) //升序
{
int pivot = A[low];//第一个元素为基准点
while (low < high)
{
while (low<high && (A[high]>=pivot))high--;//循环向前寻找小于pivot的值
A[low] = A[high];//比枢纽小的放在前头
while (low < high && (A[low] <= pivot))low++;
A[high] = A[low];//比枢纽大的放在后头
}
A[low] = pivot;//也可以使用high,因为最后指向同一个位置,枢纽元素放在两个表中间
printf("此次划分结果为:");
for (int i = 0; i < 8; i++)
{
printf("%d ", A[i]);
if (i == 7)printf("\n");
}
return low;//返回枢纽的位置
}
分别用low,high指针指向每一次划分表的第一个元素与最后一个元素,并将第一个元素第一个元素设置为基准点。判断若high>low则循环,若high所指向的数据大于pivot则high--反复向前寻找,若找到则退出循环将high所指向的数据放入low的位置。再从low的位置循环向后找,若找到大于pivot的数据则将它放入high所指向的位置,依次反复,直到high<=low。
快速排序
void QuickSort(int A[], int low,int high)//分别指向表头与表尾
{
if (low < high) //递归跳出循环的条件
{
int pivot = Partition(A, low, high);
QuickSort(A, low, pivot - 1);//划分左表
QuickSort(A, pivot+1,high);//划分右表
}
}
从划分的结果中返回pivot的位置,然后继续划分之后的两个表