当前位置:网站首页>快速排序
快速排序
2022-08-08 06:29:00 【物联网布道者】
快速排序
算法简介
快速排序是一种非常高效的算法。首先排序速度比较快,这个从名字就可以看出来,快速排序的平均时间复杂度为O(nlogn),最坏情况为O(n2),最好情况为O(n)。而且快速排序是一种原地排序算法,只需要很小的栈作为辅助空间,很适合大数据集的比较。
算法思想
快速排序算法是分为分割和递归两部分。分割指的是将选取一个基准值,然后将序列分割为左边小于该基准值,右边大于该基准值两部分。 递归指的是分别对左边和右边两部分再次分割,当递归到底时,序列便排序完成。
快速排序流程如下

代码实现
void swap(int* a,int* b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
//分割代码,将序列 区间[l,r-1]分为[l,j],[j+1,r]两部分
int partation(int arr[],int l,int r)
{
int select = arr[l];
int index = l;
for(int i=l;i<r;i++){
if(arr[i] < select){
swap(&arr[index+1],&arr[i]);
index++;
}
}
swap(&arr[l],&arr[index]);
return index;
}
//递归代码: 对数组区间为[l,r)区间内元素进行快速排序
void QuickSort(int arr[],int l,int r)
{
if(l>=r) return;
int pip_index = partation(arr,l,r);
QuickSort(arr,l,pip_index);
QuickSort(arr,pip_index+1,r);
}
上面便是快速排序的基本实现原理,但是上述代码有一点缺陷,如果需要排序的序列内重复的元素非常多,会大大影响快速排序的效率,下面为大家介绍一下三路快排的思想以及实现代码
三路快排的实现思想非常简单,顾名思义,就是将序列分为三部分,小于基准值,等于基准值,大于基准值这三部分。
void swap(int* a,int* b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
//三路快排: 对数组区间为[l,r)区间内元素进行快速排序
void QuickSort(int arr[],int l,int r)
{
int i = l+1;
int select = arr[l];
int sm_idx = l; //区间[l+1,sm_idx]
int bg_idx = r; //区间[bg_idx,r)
if(l >= r)return;
while(i<bg_idx){
if(arr[i] < select){
swap(&arr[i],&arr[sm_idx+1]);
sm_idx++;
i++;
}else if(arr[i] > select){
swap(&arr[i],&arr[bg_idx-1]);
bg_idx--;
}else{
i++;
}
}
swap(&arr[l],&arr[sm_idx]);
QuickSort(arr,l,sm_idx);
QuickSort(arr,bg_idx,r);
}
边栏推荐
猜你喜欢
随机推荐
【Excel】csv文件修改分隔符
Zip文件的解析与生成
Task02:PyTorch进阶训练技巧
Background Suppression Network for Weakly-supervised Temporal Action Localization
websocket结合消息队列完成多台服务器下的订单服务主动通知
文件上传场景
论文解读:iDRNA-ITF:基于诱导和转移框架识别蛋白质中的DNA和RNA结合残基
datetime模块,os模块,sys模块,json模块
盛水最多的容器
超大Excel文件读写 :使用SXSSFWorkbook和EasyExcel方式对比
Math工具类的ceil()、floor()、round()方法源码阅读
自动化测试------selenium
动手学数理统计(2)
List、Set、Map、Queue、Deque、Stack遍历方式总结
日常用到的开源软件列表
使用websocket实现服务端主动发送消息到客户端
动手学概率论(2)
VS2015MFC+SQLService版本的选择
一篇文章带你解读蓝牙配对绑定
Unity_折线图+UI动画







![[总结]Unity Console面板的问题汇总](/img/c9/df7b4c00bc239d7b306b9625d1e128.png)

