首页 > 其他分享 >16.6快速排序实战

16.6快速排序实战

时间:2023-04-13 17:33:19浏览次数:131  
标签:实战 TableLen include int ElemType ST 16.6 low 排序

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string>
typedef int ElemType;
typedef struct {
    ElemType *elem;  //存储元素的起始地址
    int TableLen;    //元素个数
}SSTable;

void ST_Init(SSTable &ST,int len)
{
    ST.TableLen=len;
    ST.elem=(ElemType *) malloc(sizeof (ElemType)*ST.TableLen);  //申请一块空间,当数组来使用
    int i;
    srand(time(NULL));//随机数生成,每一次执行代码就会得到随机的10个元素
    for (int i = 0; i < ST.TableLen; i++) {
        ST.elem[i]=rand()%100;   //生成的是0-99之间
    }
}
//打印数组中的元素
void ST_print(SSTable ST)
{
    for (int i = 0; i < ST.TableLen; i++) {
        printf("%3d",ST.elem[i]);
    }
    printf("\n");
}

//快速排序核心函数,挖坑法
int partition(ElemType *A,int low,int high)
{
    ElemType pivot=A[low];  //拿最左边的作为分割值,并存储下来
    while (low<high)
    {
        while (low<high&&A[high]>=pivot)
            high--;
        A[low]=A[high];    //把比分隔值小的那个元素,放到A[low]
        while (low<high&&A[low]<=pivot)  //从前往后遍历,找到一个比分隔值大的
            low++;
        A[high]=A[low];   // 把比分隔值大的那个元素,放到A[high],因为刚才high位置的元素已经放到了low的位置
    }
    A[low]=pivot;    //把分隔值放到中间位置,因为左边元素都比它小,右边都比它大
    return low;      //返回分隔值所在的下标
}

void QuickSort(ElemType *A,int low,int high)
{
    if (low<high)
    {
        int pivot_pos= partition(A,low,high);   //pivot用来存储分隔值的位置
        QuickSort(A,low,pivot_pos-1);      //前一半继续归并排好
        QuickSort(A,pivot_pos+1,high);
    }
}
int main() {
    SSTable ST;
    ST_Init(ST,10);
    //ElemType A[10]={64,94,95,79,69,84,18,22,12,78};
    //内存copy接口,当copy整型数组,或者浮点型时,要用memcpy,不能用strcpy,初试考memcpy概率很低
    //memcpy(ST.elem,A,sizeof (A));//这是为了降低调试难度,每次数组数据固定而设计的
    ST_print(ST);   //随机后的结果打印
    QuickSort(ST.elem,0,9);
    ST_print(ST);//排序后再次打印
    return 0;
}

标签:实战,TableLen,include,int,ElemType,ST,16.6,low,排序
From: https://www.cnblogs.com/su-1007/p/17315740.html

相关文章

  • Python网络爬虫学习实战:爬虫快速入门
    很多同学私信问爬虫的相关教程,想了想,还是专门跟大家出些Python爬虫学习相关的教程,从零开始阐述如何编写Python网络爬虫,以及网络爬虫中容易遇到的问题,比如具有反爬加密的网站,还有爬虫拿不到数据,以及登录验证等问题,会伴随大量网站的爬虫实战来进行。我们编写网络爬虫最主要的目的是爬......
  • 排序算法-交换排序
    排序算法-交换排序1.冒泡排序BubbleSort1.1BubbleSort介绍冒泡排序(BubbleSort)的基本思想是:通过对待排序的序列进行从左往右(即从下标较小的元素开始),依次比较相邻元素的值,若逆序则将其顺序交换。重复执行此过程直至没有需要交换的元素,也即说明改序列完成了排序,冒泡排序会......
  • 解密!FastDFS的安装及部署(实战篇)
    前言天猫、淘宝等购物网站,海量的商品图片和视频,是如何存储的?当用户访问量大时,又如何保证下载速度?分布式文件系统就是用来解决这些问题的。那么分布式文件系统该如何使用呢?别急,今天袁老师就会带领大家来学习这些非常实用的技能:分布式文件系统概述主流的分布式文件系统的介绍重点介绍......
  • 4.【RabbitMQ实战】- 发布确认
    生产者将信道设置成confirm模式,一旦信道进入confirm模式,所有在该信道上面发布的消息都将会被指派一个唯一的ID(从1开始),一旦消息被投递到所有匹配的队列之后,broker就会发送一个确认给生产者(包含消息的唯一ID),这就使得生产者知道消息已经正确到达目的队列了,如果消息......
  • 3.【RabbitMQ实战】- 工作队列(Work Queue)
    工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。在后台运行的工作进程将弹出任务并最终执行作业。当有多个工作线程时,这些工作线程将一起处理这些任务。轮询分发消息......
  • 10.【RabbitMQ实战】- RabbitMQ集群
    搭建集群镜像队列默认情况下node1创建的队列不会同步到node2上此时如果已经发送到了一条消息到node1上的队列,该队列并不会备份到node2上此时node1宕机并重启,该消息会丢失,配置对应策略可保证集群上队列备份并且消息不丢失负载均衡生产者给node1发消息,此时node1宕机,但是......
  • 9.【RabbitMQ实战】- RabbitMQ其他知识点
    幂等性MQ消费者的幂等性的解决一般使用全局ID或者写个唯一标识比如时间戳或者UUID或者订单消费者消费MQ中的消息也可利用MQ的该id来判断,或者可按自己的规则生成一个全局唯一id,每次消费消息时用该id先判断该消息是否已消费过在海量订单生成的业务高峰期,生产端有可能就会重复发......
  • Go微服务框架go-kratos实战学习08:负载均衡基本使用
    微服务框架go-kratos中负载均衡使用一、介绍在前面这篇文章负载均衡和它的算法介绍,讲了什么是负载均衡以及作用、算法介绍。go-kratos的负载均衡主要接口是Selector,它是一个可插拔的设计。因为它设计的都是接口,只要实现了接口就实现了负载均衡。go-kratos在目录下提供了......
  • 一个朋友问的排序问题,Collections.sort
    importjava.util.ArrayList;importjava.util.Collections;importjava.util.List;publicclassMySortimplementsComparable<MySort>{privateStringname;privateintage;publicMySort(){super();}publicMySort(Stringname,in......
  • w6 T325337 【模板】快速排序
     主要思路:整体思路就是把<num[mid]的元素扔到mid左边,把>num[mid]的元素扔到mid右边,然后用同样的方法对mid左边和右边的序列进行处理。在代码实现上我使用了双指针。以样例为例:num[0]=4num[1]=2num[2]=4num[3]=5num[4]=1mid=num[2]第一次处理后:12454mid_left=num[0......