快速排序
1.概念
快速排序算法是基于分址策略的一种排序算法。
2.基本思想
对于输入的子数组arr[l:n],按以下三个步骤进行排序。
- 分解(Divide):以arr[l]为基准元素将a[l:r]划分成3段a[l:p-1],a[q]和a[q+1:r],使a[l:q-1]中任何一个元素小于等于a[q],而a[q+1:r]中任何一个元素大于等于a[q]。下标q在划分过 程中确定。
- 递归求解(Conquer):通过递归调用快速排序算法,分别对arr[l:q-1]和arr[q+1:r]进行排序。
- 合并(Merge):由于对arr[l:q-1]和arr[q+1:r]的排序是就地进行的,因此在arr[l:q-1]和arr[q+1:r]都已排好的序后,不需要执行任何计算,arr[l:r]则已排好序。
3.工作原理
4.代码
#include<bits/stdc++.h>
using namespace std;
#define true 1
int partition(int arr[], int l, int r);
void quicksort(int arr[], int l, int r);
int main() {
int n;
int arr[100];
printf("请输入要排序的数据个数:");
scanf("%d", &n);
printf("请输入要排序的数组:");
for(int i = 0; i < n; i++)
scanf("%d", &arr[i]);
printf("排好序后的数组:");
quicksort(arr, 0, n-1);
for(int i = 0; i < n; i++)
printf("%2d", arr[i]);
return 0;
}
int partition(int arr[], int l, int r)
{
int i = l, j = r + 1;
int x = arr[l];
//将小于x的元素交换到左边区域,将大于x的元素交换到右边区域
while (true)
{
while(arr[++i] < x && i < r)
;
while(arr[--j] > x)
;
if(i >= j)
break;
swap(arr[i], arr[j]);
}
arr[l] = arr[j];
arr[j] = x;
return j;
}
//递归实现
void quicksort(int arr[], int l, int r)
{
if(l > r)
return;
int index = partition(arr, l, r);
//得出分界点
quicksort(arr, l, index-1);
quicksort(arr, index+1, r);
}
5.算法分析
分类:排序算法
算法种类:分治算法
数据结构:数组
最优时间复杂度:O(nlog2n)
最坏时间复杂度:O(n2)
平均时间复杂度:O(nlog2n)
最坏空间复杂度:O(log2n)
稳定性:不稳定
复杂性:较复杂
(如有错误,请在下面评论区指出)