[C++] 快速排序 (递归)

快速排序

代码

/*
    快速排序算法
    Reference: https://www.geeksforgeeks.org/quick-sort/
*/ 
#include<iostream>
using namespace std;

void printList(int *Arr,int ArrLen);

int partition(int s[],int low, int high){
    /* 刚开始假定 pivot 即最大值为数组最末端的值 */
    int pivot = s[high];  
    int i = low-1;
    for (int j = low; j <= high-1; j++){
        /* 
            1. i 相当于分区界限的下标,并且每次循环后界限下标位置的值一直都是小于 pivot 的
            2. 最开始界限下标首先处于 -1,然后查找到界限下标右侧第一个小于 pivot 的值时,界限下标位置向右移一位,然后将其与界限下标所在的位置的值进行交换
               这样做就能一直使界限下标处的值小于 pivot
        */
        if (s[j] < pivot){
            i++;    
            swap(s[i],s[j]);
        }
    }
    swap(s[i + 1],s[high]);
    return (i + 1);
}

int* quickSort(int s[],int low, int high, int listSize){
    int pi;
    if (low < high){
        /* pi 相当于界限下标 */
        pi = partition(s,low,high);
        /* 
            1. 分别在分区界限的两侧执行快排 
            2. 经过 partition 处理过后,pi 左侧的元素全部小于 pivot 并且 pi 右侧的元素全部大于 pivot
            3. 然而无论是界限下标处左侧还是右侧的排序还是混轮乱的,因此需要对左右侧分别执行一下快排(需要用的递归)
        */
        printList(s, listSize);
        quickSort(s, low, pi-1,listSize);  
        quickSort(s, pi + 1,high,listSize); 
    }
    return s;
}

/* 打印输出 */
void printList(int *Arr,int ArrLen){
    for(int i=0;i<ArrLen;i++){
        cout<<Arr[i]<<" ";
    }
    cout<<endl;
}

int main(int argc, char const *argv[])
{
    int list[] = {4, 10, 8, 1, 9, 7, 2, 6, 3,5,11}; 
    int listSize = sizeof(list)/sizeof(list[0]);
    int* s = quickSort(list,0,listSize-1,listSize);
    cout<<"The final sort result:"<<" ";
    printList(s, listSize);
    return 0;
}

执行效果:

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值