定义:根据序列中两个元素关键字的比较结果来对换这两个记录在序列中的位置。
算法思路:在待排序表L[1,…,n]中任取一个元素pivot作为基准(通常取首元素),通过一趟排序将待排序表划分为独立的两部L[1,…,k-1]和L[k+1,…,n],使得L[1,…,k-1]中所有元素小于pivot,L[k+1,…,n]中所有元素大于等于pivot,则pivot放在了其最终位置L[k]上,这个过程称为一次“划分”。然后分别递归地对两个子表重复上述过程,直到每部分内只有一个元素或空为止,即所有元素放在了其最终位置上。
空间复杂度:最好=O(log2(n))、最坏=O(n)。
时间复杂度:最好=O(nlog2(n))、最坏=O(n^2)。
算法稳定性:不稳定。
适用性:可用于顺序表和链表。
优点:快速排序是所有内部排序算法中平均性能最优的排序算法。
实现代码:(递归实现)
#include <stdio.h> // 输入输出
#include <windows.h> // system函数
#define MaxSizeD 10
// 快速排序枢轴定位算法
int Partition(int *arr, int low, int high)
{
int pivot = arr[low]; // 第一个元素作为枢轴
while (low < high)
{
while (low < high && arr[high] >= pivot)
{
high--; // 比较右边的元素,如果右边比枢轴元素大,则不需要改变元素位置,右边往前移即可
}
arr[low] = arr[high]; // 右边元素比枢轴元素小,则往前排
while (low < high && arr[low] <= pivot)
{
low++; // 比较右边的元素,如果左边比枢轴元素小,则不需要改变元素位置,左边往后移即可
}
arr[high] = arr[low]; // 左边元素比枢轴元素大,则往后排
}
// 当low = high则表明该位置为枢轴的位置
arr[low] = pivot;
return low; // 返回枢纽的位置
}
// 快速排序
void QuickSort(int *arr, int low, int high)
{
if (low < high)
{ // 递归跳出的条件
int pivotpos = Partition(arr, low, high);
QuickSort(arr, low, pivotpos - 1); // 划分左表
QuickSort(arr, pivotpos + 1, high); // 划分右表
}
}
// 打印
void PrintList(int *A, int n)
{
int i;
for (i = 0; i < n; i++)
{
printf("%d", A[i]);
printf("\n");
}
}
int main()
{
int D[MaxSizeD] = {87, 75, 66, 52, 14, 71, 33, 12, 22, 55};
// 快速排序
QuickSort(D, 0, 9);
PrintList(D, MaxSizeD);
printf("\n");
system("pause"); // 避免exe程序自动退出
return 0;
}