【算法】快速排序的递归实现算法(两种实现)

思想:

 

 

具体操作:

1.先以第一个元素为key(枢纽),设置两个变量i、j,排序开始的时候:i=0,j=N-1;

2.然后i++开始往后移动,j--开始往前移动,直到找到一个i,第i位的值大于key,再找到一个j,第j位的值小于key

3.则交换第i位和第j位的值

4.继续操作,重复2和3步骤,直到i=j;则将现在的i位置上的值和key交换。这个时候key前正好都是小于它的数,后面都是大于它的数,从而key正好到了排好序后正确的位置。

5,之后将第i位之前和i之后的数分别独立出,进行1,2,3,4操作,直到最后每个独立序列中支有一个元素,那么快排完成。

按照此方法:

输入:先输入进行合并排序元素的个数,然后依次随机输入(或随机生成)每个数字

输出:元素排序后的结果。

示例:输入:8  9  1  2  4  8  6  15  8,输出:1  2  4  6  8  8  9  15

#include <bits/stdc++.h>

using namespace std;

int div(int a[],int left,int right){
    int key=a[left];  //第一个值作为基准值
    int i=left,k=right;
    // 将< x的元素交换到左边区域
    // 将> x的元素交换到右边区域
    while(i<k){
        while(i<k&&a[i]<=key)i++;
        while(a[k]>key)k--;
        if(i<=k) swap(a[i],a[k]);
    }
    swap(a[left],a[k]);   //基准值到达最终位置
    return k;
}


void quicksort(int a[],int left,int right){
    if(left<right){//序列有效
        int p = div(a,left,right);
        quicksort(a,left,p-1);//对左半段排序
        quicksort(a,p+1,right);//对右半段排序
    }
}

int main(){
    int n;
    cin>>n;
    int a[n];
    for(int i=0;i<n;i++)cin>>a[i];
    quicksort(a,0,n-1);
    for(int i=0;i<n;i++)cout<<a[i]<<" ";
    return 0;
}

 

 

另一种写法:

把找到的小于key 的直接扔到左边,大于key的扔到右边,直到最后再将key值归位

#include <stdio.h>
#include <stdlib.h>

void quick_sort(int *a, int left, int right)
{

    if(left >= right)/*如果左边索引大于或者等于右边的索引就代表已经整理完成一个组了*/
    {
        return ;
    }

    int i = left;
    int j = right;
    int key = a[left];

    while(i < j)  
    {
        /*而寻找结束的条件就是,1,找到一个小于或者大于key的数(大于或小于取决于你想升
        序还是降序)2,没有符合条件1的,并且i与j的大小没有反转*/
        while(i < j && key <= a[j])j--;
        /*找到一个这样的数后就把它赋给前面的被拿走的i的值(如果第一次循环且key是
        a[left],那么就是给key)*/
        a[i] = a[j];

        /*这是i在当组内向前寻找,同上,不过注意与key的大小关系停止循环和上面相反,
        因为排序思想是把数往两边扔,所以左右两边的数大小与key的关系相反*/
        while(i < j && key >= a[i])i++
        a[j] = a[i];
    }
    a[i] = key;//基准值到达最终位置
    
    quick_sort(a, left, i - 1);//对左半段排序
    quick_sort(a, i + 1, right);//对右半段排序
}

int main(void)
{
    int N;
    scanf("%d",&N);
    int a[N], i;


    printf("Please enter %d number of sorting: ", N);
    for(i = 0; i < N; i++)
    {
        scanf("%d", &a[i]);
    }

    quick_sort(a, 0, N - 1);

    printf("In sorted order: ");
    for(i = 0; i < N; i++)
    {
        printf("%d \n", a[i]);

    }

    return 0;
}

 

全部评论

相关推荐

双飞二本嵌入式求拷打我是在&nbsp;BOSS&nbsp;上投递的简历,好多都没人回复,这是开场白和简历求大神帮忙看看。您好!我是2025届应届生,最快可在一周内上岗,能够实习六个月以上,并接受加班。以下是我的核心优势和相关经验:1.&nbsp;嵌入式开发能力:&nbsp;&nbsp;&nbsp;熟练掌握STM32系列单片机及其外设(如GPIO、定时器、ADC、DAC、I2C、SPI、UART等),能够独立完成硬件驱动开发和调试。&nbsp;&nbsp;熟悉FreeRTOS实时操作系统,具备多任务调度和资源管理经验。&nbsp;&nbsp;熟悉LVGL图形库开发,能够实现嵌入式设备的图形界面设计。2.&nbsp;硬件设计能力:&nbsp;&nbsp;&nbsp;具备PCB设计经验,曾为2023年工创赛物流搬运赛道设计小车主板,带领团队获得国家级银奖。&nbsp;&nbsp;&nbsp;熟悉硬件原理图分析,能够快速理解并调试硬件电路。3.&nbsp;机器人开发与竞赛经验:&nbsp;&nbsp;&nbsp;在全国大学生智能车竞赛、ROS机器人竞赛中多次获得国家级奖项,具备丰富的机器人开发经验。&nbsp;&nbsp;&nbsp;熟悉Linux环境,对ROS和ROS&nbsp;2有一定了解,能够进行机器人系统的开发与调试。4.&nbsp;编程能力:&nbsp;&nbsp;&nbsp;熟悉C/C++,熟悉Python,能够高效完成嵌入式开发和算法实现。&nbsp;&nbsp;&nbsp;具备良好的代码规范和文档编写能力。5.&nbsp;团队协作与领导能力:&nbsp;&nbsp;&nbsp;在多个项目中担任核心开发或团队负责人,具备良好的沟通能力和团队协作精神。&nbsp;&nbsp;&nbsp;在工创赛中带领团队完成项目规划、任务分配和技术攻关,展现了较强的领导力。我对嵌入式开发、机器人技术和智能硬件充满热情,期待加入贵公司,与团队共同成长,为公司创造价值!如果有合适的岗位,欢迎随时联系我,期待进一步沟通!
沉淀一会:嵌入式就是狗屎
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务