快速排序详解——算法笔记实现方式

一、什么是快速排序

快速排序是对冒泡排序对一种改进

*动图来自菜鸟教程

二、实现方式

  1. 先从数列中取出一个数作为基准数。
  2. 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
  3. 再对左右区间重复第二步,直到各区间只有一个数。

三、关于快速排序的性能参数

1、空间复杂度

最好: O ( log ⁡ 2 n ) O(\log_2 n) O(log2n)
最坏: O ( n ) O(n) O(n)
平均: O ( log ⁡ 2 n ) O(\log_2 n) O(log2n)

2、时间复杂度

O ( n 2 ) O(n^2) O(n2)

3、是否稳定

不稳定

4、适用于何类型存储

顺序存储

四、代码实现

1、对于把大的数放到基准数右边,消小的数放到基准数左边

有很多方法

这里使用two pointers

①先将 A[1]存至某个临时变量 temp,并令两个下标 left、right 分别指向序列首尾(如令left=1、right=n)

②只要 right 指向的元素 A[right] 大于 temp,就将 right 不断左移;当某个时候 A[right] ≤temp 时,将元素 A[right]挪到 left 指向的元素 A[left]处。

③只要 left 指向的元素 A[left] 不超过 temp,就将 left 不断右移;当某个时候 A [left]> temp 时,将元素 A[left]挪到 right 指向的元素 A[right]处。

④重复②③,直到 left 与 right 相遇,把 temp(也即原 A [1]) 放到相遇的地方。

代码实现此功能
// 对于[left,right]区间进行划分
int Partition(int A[], int left, int right){
    int temp = A[left]; //将A[left]存放在temp中
    while(left < right){    // 只要right 与 right不相遇
        while(left < right && A[right] > temp) right--;     //反复左移right
        A[left] = A[right]; 
        while(left < right && A[right] <= temp) right--;     //反复左移right
        A[right] = A[left];
    }
    A[left] = temp; //把temp放到left与right相遇的地方
    return left;    //返回相遇的位置的下标
}
2、快速排序实现
void quickSort(int A[], int left, int right){
    if(left < right){
        int pos = Partition(A, left, right);
        quickSort(A, left, pos - 1);    //对左子区间递归进行快排
        quickSort(A, pos + 1, right);    //对右子区间递归进行快排

    }
}
3、程序实例实现
/*
 * @Descripttion: 
 * @version: 
 * @Author: edisonhuang
 * @Date: 2020-03-16 14:45:02
 * @LastEditors: edisonhuang
 * @LastEditTime: 2020-03-16 15:22:25
 */
#include <iostream>
int Partition(int A[], int left, int right);
void Print(int A[], int len);
void quickSort(int A[], int left, int right);
using namespace std;

int main()
{
    int arr[] = {13, 14, 8, 100, 25, 75, 9, 64, 12};
    int len = (int) sizeof(arr) / sizeof(*arr);
    Print(arr,len);
    quickSort(arr, 0, len - 1 );
    Print(arr,len);
}


int Partition(int A[], int left, int right){
    int temp = A[left]; //将A[left]存放在temp中
    while(left < right){    // 只要right 与 right不相遇
        while(left < right && A[right] >= temp) 
            right--;     //反复左移right
        if (left < right){
            A[left] = A[right]; 
        }
        while(left < right && A[left] <= temp) 
            left++;     //反复左移right
        if (left < right){
            A[right] = A[left];

        }
    }
    A[left] = temp; //把temp放到left与right相遇的地方
    return left;    //返回相遇的位置的下标
}

void quickSort(int A[], int left, int right){
    if(left < right){
        int pos = Partition(A, left, right);
        quickSort(A, left, pos - 1);    //对左子区间递归进行快排
        quickSort(A, pos + 1, right);    //对右子区间递归进行快排

    }
}

void Print(int A[], int len)
{
    for (int i = 0; i < len; i++)
    {
        cout << A[i] << " ";
    }
    cout << endl;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值