【算法基础】-- 交换排序篇 - 快速排序

快速排序是对冒泡排序的一种改进。快速排序是所有内部排序算法中平均性能最优的算法。

其基本思想是基于分治法的:
在待排序表中任取一个元素 pivot 作为枢轴,通过一趟排序将待排序表划分为独立的两部分,即枢轴 pivot 左部分小于 pivot ,右部分大于 pivot ,其交换过程是基于 low , high 两个指针来实现的,传统的快速排序,是将枢轴元素与 low 或 high 所指的元素交换,而实质上,一趟快排未结束之前 pivot 的位置是无关紧要的,故可以简化操作,到最后再决定枢轴元素的位置,此时枢轴的位置即为枢轴元素的最终位置,即每趟快速排序,都会确定一个元素的最终位置。

一趟快速排序初始状态示意图:(一般将第一个元素设为枢轴)
在这里插入图片描述
一趟快速排序结果示意图:
在这里插入图片描述
算法存储结构的适用性:算法仅限顺序存储结构,因为涉及到了数组的随机存取。

算法实现

/*
    快速排序:
        时间复杂度->最好情况:O(nlogn)、平均情况:O(nlogn)、最坏情况:O(n^2)
        空间复杂度->最好情况:O(log(n+1))、平均情况:O(logn)、最坏情况:O(n)
        是否稳定->否
*/
#include<bits/stdc++.h>
#define MAX_SIZE 10
using namespace std;
typedef struct{
    int key;
}ElemType;
int Partition(ElemType A[],int low,int high){
    ElemType pivot=A[low];//将第一个值作为枢轴,即A[low]
    while(low<high){
        while(low<high&&A[high].key>=pivot.key) --high;//结束循环时,high指向的位置,A[high].key已经大于了枢轴的值
        A[low]=A[high];
        while(low<high&&A[low].key<=pivot.key) ++low;//结束循环时,low指向的位置,A[low].key已经小于了枢轴的值
        A[high]=A[low];
    }
    A[low]=pivot;//此时low=high
    return low;
}//枢轴的交换机制,决定了,快速排序为一个不稳定的排序,如 5、4、3、4 取枢轴为 5 ,low 为 5 ,high 为 4,此时交换,则4的相对位置会交换
void QuickSort(ElemType A[],int low,int high){
    if(low<high){//基于分治的思想,当元素只剩下两个时,因为两个元素一次快排就已经有序了,当在对其子序列进行排序时,就没必要了(此时只会产生low=high,或者low>high,即不符合if条件,递归结束)
        int pivotpos=Partition(A,low,high);
        QuickSort(A,low,pivotpos-1);
        QuickSort(A,pivotpos+1,high);
    }
}
int main(){
    ElemType A[MAX_SIZE]={{10},{9},{8},{7},{6},{5},{4},{3},{2},{1}};
    QuickSort(A,0,MAX_SIZE-1);
    for(int j=0;j<MAX_SIZE;j++){
        cout<<A[j].key;
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值