快速排序是交换排序的一种,下面是快速排序的一些特征:
- 平均时间复杂度:O(nlog2n)
- 最坏情况:O(n^2)
- 最好情况:O(nlog2n)
- 平均空间复杂度:O(log2n)
- 最坏情况:O(n)
- 最好情况:O(log2n)
- 是否稳定:不稳定
快速排序的一次划分会将一个元素放到排好序的最终位置上
下面是快速排序的代码:
/**
* arr 为需要排序的数组名
* low 为起始元素下标
* high 为末尾元素下标
*/
void quick_sort(int arr[], int low, int high)
{
if (low < high) {
int pivotPos = partitionf(arr, low, high); // 将一组数划分为两组
quick_sort(arr, low, pivotPos-1);
quick_sort(arr, pivotPos+1, high);
}
}
/**
* 划分函数,执行一次,将一个元素放到最终位置
* 并返回这个元素的索引,作为划分的位置
*/
int partitionf(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];
}
arr[low] = pivot;
return low;
}
测试代码,可直接复制后编译执行:
#include <stdio.h>
void quick_sort(int *, int, int);
int partitionf(int *, int, int);
void show(int *, int);
int main()
{
int n = 4;
int arr[] = {7, 10, 11, 9};
quick_sort(arr, 0, n-1);
show(arr, n);
return 0;
}
/**
* arr 为需要排序的数组名
* low 为起始元素下标
* high 为末尾元素下标
*/
void quick_sort(int arr[], int low, int high)
{
if (low < high) {
int pivotPos = partitionf(arr, low, high); // 将一组数划分为两组
quick_sort(arr, low, pivotPos-1);
quick_sort(arr, pivotPos+1, high);
}
}
/**
* 划分函数,执行一次,将一个元素放到最终位置
* 并返回这个元素的索引,作为划分的位置
*/
int partitionf(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];
}
arr[low] = pivot;
return low;
}
void show(int arr[], int len)
{
int i;
for (i=0; i<len; i++) {
printf("%4d", arr[i]);
}
printf("
");
}