首页 > 编程语言 >算法学习—快速排序

算法学习—快速排序

时间:2024-11-11 15:16:57浏览次数:3  
标签:arr right int 学习 算法 数组 pivot 排序 left

1.算法介绍  

  快速排序算法是一种高效排序算法,效率相比普通排序算法较高,通常情况下时间复杂度为O(nlog n),但在最坏情况下时间复杂度会提高到O(n^2)

2.算法思想和大致步骤

  快速排序算法主要用到了二分和递归的思想,主要有三个步骤:(1)在数组中选取一个元素作为基准值(pivot);(2)将基准值与数组中的剩余数值进行比较,比基准值大的放置于基准值的右边数组,比基准值小的放置于左边数组;(3)将基准值的左右两边分为两个数组,分别对这两个数组递归执行上述操作,直到数组不可再分;最后可以得到处理好的数组

3.算法详细步骤以及代码演示

step1:

  生成三个随机数组,长度分别为5,10,100,用作后续的排序

    int array5[5];
    int array10[10];
    int array100[100];
    int i,j,k;
    printf("array5:\n");
    for(i=0;i<5;i++){
        array5[i] = rand()%1000000000;
        printf("%d ", array5[i]);
        printf("\n");
    }
   
    printf("array10:\n");
    for(j=0;j<10;j++){
        array10[j]=rand()%100000000;
        printf("%d ", array10[j]);
        printf("\n");
    }
    printf("array100:\n");
    for(k=0;k<100;k++){
        array100[k]=rand()%1000000000;
        printf("%d ", array100[k]);
        printf("\n");
    }

step2:

  开始编写排序模块,这里我选择将排序模块分为quick(),quicksoft()函数。quicksoft()函数接收我们之前随机生成的数组以及该数组的最左(left)最右指针(right)。在函数中,我们定义数组的最左指针为基准值,要注意,定义完基准值后,我们要将left指向的基准值暂时提取出数组,此时left指针指向的数组位置为空,为后续指针所指向的数值额度移动做准备。理解并完成上述步骤后就可以开始后续的排序了:由于left指针指向的为空数组,所以我们现在需要移动right指针,此时right指针指向的为数组最后一个元素,假设该指针指向元素比pivot小,按照算法思想,我们需要将改数值放置于基准值的左边,现在我们可以发现,在数组的最右边存在一个空位可以存放我们需要移动的数值,将该数值移动至左边的空值后,right指针指向的位置也空出来了,此时,将left指针往右移动一位,假设现在left指针指向的数值比pivot大,按照算法思想需要存放于pivot的右边,此时我们发现现在right指向的位置为空,将该数值存放于此,并将right指针的位置向左移动一位;后续的步骤以此类推,直到left指针right指针指向同一个位置,会发现该位置为一个空为,将pivot存放于该处,这样就完成了第一次的排序,返回此时的pivot。

代码示例:

int quicksort(int arr[],int left,int right){
    int pivot = arr[left];//定义pivot(初始值)
    while (right>left)//判断该数组是否能进行排序
    {
        
     while (right>left && arr[right]<pivot)//当右指针指向的数值小于pivot时
     {
        
        right--;//指针向左移动一位
     }
     arr[left]=arr[right];//将right指向的值赋予left指针指向的空位
     while (right>left && arr[left]>pivot)//当左指针指向的数值小大于pivot时
     {
        
         left++;//指针向右移动一位
     }
     arr[right]=arr[left];将left指向的值赋予right指针指向的空位
     
    }
    arr[right]=pivot;//此时left,right指针指向同一个空位,存放pivot
    return right;
    

}

  编写quick()函数,此函数接收数组,最左最右指针,并将该数组经过quicksoft()函数排序后的分为从pivot分为左右两部分,将左,右数组分别进行递归,直到无法再继续分割递归,此时数组已经排序完成

代码示例:

void quick(int arr[],int left,int right){
    if(right>left)//判断是否可以继续递归
    {
        int pi = quicksort(arr,left,right);//将数组进行初步排序,获取pivot值
        quick(arr,left ,pi);//将piv左边的数组进行递归排序
        quick(arr,pi+1,right);//将piv右边的数组进行递归排序
    
    }
}

step3:

  输出排序后的数组

void printarray(int arr[],int size){
    for (int i = 0; i < size; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
    
}

我们就可以得到排序好的数组了。

完整代码示例:

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

int quicksort(int arr[],int left,int right){
    int pivot = arr[left];
    while (right>left)
    {
        
     while (right>left && arr[right]<pivot)
     {
        
        right--;
     }
     arr[left]=arr[right];
     while (right>left && arr[left]>pivot)
     {
         arr[right]=arr[left];
         left++;
     }
     arr[right]=arr[left];
     
    }
    arr[right]=pivot;
    return right;
    

}
void quick(int arr[],int left,int right){
    if(right>left)
    {
        int pi = quicksort(arr,left,right);
        quick(arr,left ,pi);
        quick(arr,pi+1,right);
    
    }
}

void printarray(int arr[],int size){
    for (int i = 0; i < size; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
    
}
int main(){
    srand(time(NULL));
    int array5[5];
    int array10[10];
    int array100[100];
    int i,j,k;
    printf("array5:\n");
    for(i=0;i<5;i++){
        array5[i] = rand()%1000000000;
        printf("%d ", array5[i]);
        printf("\n");
    }
   
    printf("array10:\n");
    for(j=0;j<10;j++){
        array10[j]=rand()%100000000;
        printf("%d ", array10[j]);
        printf("\n");
    }
    printf("array100:\n");
    for(k=0;k<100;k++){
        array100[k]=rand()%1000000000;
        printf("%d ", array100[k]);
        printf("\n");
    }
    printf("quicknewarray5:");
    printf("\n");
    quick(array5,0,5);
    printarray(array5,5);
    printf("\n");
    printf("quicknewarray10:");
    printf("\n");
    quick(array10,0,10);
    printarray(array10,10);
    printf("\n");
    printf("quicknewarray100:");
    printf("\n");
    quick(array100,0,100);
    printarray(array100,100);
    printf("\n");

}
   

交流学习可联系:[email protected]

标签:arr,right,int,学习,算法,数组,pivot,排序,left
From: https://blog.csdn.net/weixin_74390075/article/details/143660295

相关文章

  • LangChain 记忆组件深度解析:Chain 组件与 Runnable 深入学习
    在构建复杂的AI应用时,有效管理对话历史和上下文信息至关重要。LangChain框架提供了多种记忆组件,使得开发者能够轻松实现具有记忆功能的聊天机器人。本文将深入探讨LangChain中的记忆组件、Chain组件以及Runnable接口,帮助开发者更好地理解和使用这些强大的工具。LangChain......
  • [豪の学习笔记] Git的使用
    一、本地仓库1.1-工作流程1.2-本地仓库操作①全局配置:gitconfig--globaluser.name"用户名"gitconfig--globaluser.email"邮箱地址"②创建仓库:当需要让Git去管理某个项目时,就需要创建仓库。PS:创建仓库时使用的目录不一定要求是空目录,选择一个非空目录也可以......
  • 十大经典排序算法-插入排序
    插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排......
  • 网络安全怎么学习才好呢?
    搞网络安全的话,建议不要学那些乱七八糟的东西。建议:1、通信协议,包括7层协议,得搞清楚那个数据块做什么用,那个位做什么用,这点很重要李鬼可以冒充李逵。2、目前常用操作系统,建议从linux入手,都破门而入了,就不必要在乎钥匙不钥匙3、熟悉一两个开源服务程序比如apachehttp,ng......
  • 将学习型索引ALEX的cmake项目在虚拟机上用java运行
    一、环境配置虚拟机:Centos7gcc-v:11.2.1java-version:1.8.0 二、ALEX实现步骤   1、安装c++输入命令sudoapt-getinstallg++出错sudo:apt-get:找不到命令原因:Centos7中用yum命令下载再次输入命令sudoyuminstallg++再次报错已加载插件:fastestmirror,l......
  • 【Linux进程篇2】学习进程大框架,学习进程前期必备。
    --------------------------------------------------------------------------------------------------------------------------------每日鸡汤:心有多大,舞台就有多大,只有想不到的,没有做不到的。-----------------------------------------------------------------------......
  • 区域人数统计视频分析网关算法网关客流统计AI算法介绍及应用场景
    在当今数字化转型的浪潮中,人工智能技术正以其独特的数据处理能力和智能分析优势,深刻改变着各行各业的运作方式。特别是在客流量管理这一领域,AI算法的应用已经成为提升效率、优化决策的关键工具。本文将详细介绍客流量统计AI算法及其在区域人数统计视频分析网关中的应用,展示如何通......
  • 应届小白从0学习CANoe(6)
    第四章4.2measurementsteup窗口的使用measurementsetup也叫测量设置,这个窗口可以用于图形化显示和配置测试数据流, 其中包含了数据源,基本功能模块,附加功能模块,附加功能模块,数据分析窗口和数据保存模块等等。我们在工作中可以在各个组件之间添加连接线和分支线用于分解数......
  • 《深度学习模型》
    一、引言随着人工智能技术的飞速发展,深度学习模型已经成为了当今最具影响力的技术之一。深度学习模型在图像识别、语音处理、自然语言处理等领域取得了巨大的成功,为人们的生活和工作带来了极大的便利。本文将详细介绍深度学习模型的基本概念、常见类型、训练方法以及应用场景......
  • 随机化算法
    随机化算法随机化函数rand()srand(seed);intx=rand()%n+1;seed可以是一个常数如114514也可以是时间time(0)。注意,rand()函数在windows系统下返回的取值范围为\([0,2^{15}-1]\),在linux系统下返回的取值范围为\([0,2^{31}-1]\)。mt19937mt19937rd(seed);pf("......