首页 > 其他分享 >快速排序分区法

快速排序分区法

时间:2024-06-01 10:23:06浏览次数:12  
标签:arr right 基准值 int 分区 排序 快速 left


// 通过指针交换两个元素的值
void swap(int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}
/****************************************************************
 * name;subzone
 * function:part zone
 * parameter;
 *              @int arr[]
 *              @int left
 *              @int right
 * ReValue;int j
 * author;小北blog
 * attention;none
 * date;2024.06.01
 * history;
 * version;
 * Copyright(c) 2024 [email protected] All rights reserved
 *****************************************************************/
// 分区方案
int subzone(int arr[], int left, int right)
{
    int fir_ele = arr[left]; // 使用第一个元素作为基准
    int i = left;
    int j = right + 1;
    // 循环找到比基准值大小的值
    while (i < j)
    {
        // 从右侧找到第一个比基准值小的值
        do
        {
            j--;
        } while (arr[j] > fir_ele);
        // 从左侧找到第一个比基准值大的值
        do
        {
            i++;
        } while (arr[i] < fir_ele);
        // 如果i和j相遇,则分区完成
        if (i < j) // 条件不满足交换基准值和arr[j]
        {
            // 交换arr[i]和arr[j]
            swap(&arr[i], &arr[j]);
        }
    }
    // 交换基准值和arr[j]
    swap(&arr[left], &arr[j]);
    return j;
}

/****************************************************************
 * name;quickSort
 * function:sort
 * parameter;
 *              @int arr[]
 *              @int left
 *              @int right
 * ReValue;none
 * author;小北blog
 * attention;none
 * date;2024.06.01
 * history;
 * version;
 * Copyright(c) 2024 [email protected] All rights reserved
 *****************************************************************/
// 快速排序函数
void quickSort(int arr[], int left, int right)
{
    if (left < right)
    {
        int j = subzone(arr, left, right);
        quickSort(arr, left, j - 1);
        quickSort(arr, j + 1, right);
    }
}

// 打印数组
void printArray(int arr[], int size)
{
    for (int i = 0; i < size; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

// 主函数
int main()
{
    int arr[] = {66, 77, 44, 11, 99, 55};
    int n = sizeof(arr) / sizeof(arr[0]);
    printf("原来的数组: \n");
    printArray(arr, n);
    quickSort(arr, 0, n - 1);
    printf("排序后的数组: \n");
    printArray(arr, n);
    return 0;
}

运行结果:

总结:首先要确定的是快速排序的思路,就是以一个数组为一个区,第一个元素为基准值,通过操作两端的数值交换来实现快速排序的目的。
QuickSort的函数的思想,在调用分区函数subzone的时候,利用基准值最后交换后数组中所占的位置为返回值,对原数组进行分区,在利用该参数进行分左右区。
既然分区就要知道分区需要的三个参数,已知数组+数组首元素位置+数组为元素位置(数组大小-1)。
而分区函数的思想就是该空间的第一个元素的值作为基准值,从右侧找到第一个比基准值小的值,从左侧找到第一个比基准值大的值,让其交换。直到左右的值的位置也就是下标相遇,则退出该循环,基准值归位,返回基准值下标作为下次分区左区的尾元素下标和作为下次分区右区的首元素下标。最后交给QuickSort函数循环调用自身。
但是该函数递归使用的内存资源过大,属于空间换时间的例子,空间复杂度根据排列数组的,相对于该代码而言,左值越多越大,那么空间复杂度就越高,所以该代码稳定性差,理想的空间复杂度为O(logN)

标签:arr,right,基准值,int,分区,排序,快速,left
From: https://www.cnblogs.com/ikunkunkun/p/18225609

相关文章

  • 一对一直播软件源码,比较常用的数组排序方式有哪些?
    一对一直播软件源码,比较常用的数组排序方式有哪些?一、简单的sort排序:vararr=[1,5,3,87,23];arr.sort(function(a,b){returna-b;})console.log(arr);//输出:[1,23,3,5,87] 注:若返回b-a可获得从大到小的排序;数组的sort方法只能实现简单的按位排序,并不精......
  • java通过冒泡排序对数组进行排序
    冒泡排序是从列表第一个元素开始,比较相邻两个元素大小,小的排在前面,大的排后面,循环反复,小的数据会像气泡那样上浮。packageproject;publicclassMaopaopaixu{ publicstaticvoidmain(String[]args){ //冒泡排序 int[]arr={9,8,3,5,2}; for(inti=0;i<arr.le......
  • 《旋转的快速傅里叶变换》——2024.5.31
    $$\aleph$$——发疯记录(无题,不知道起什么好,用前几天看书看到的符号阿列夫表示了)我很久没发过阶段性总结类的博文了,对比去年来是少之又少。一是因为我觉得现在的日子比去年枯燥多了;二是其实我平时会写记录,但没有总的;三是上了高中以后几次语文考试我的作文成绩都很差,老师说我写的......
  • 【Go基础】快速入门
    Go基础入门用20%的时间学习常用80%的语法官方网址(下载安装/官方文档/官方类库)DownloadGobinariesfromhttps://go.dev/dl/ReferencetheofficialGodocumentationhttps://go.dev/doc/SeeallthetheGopackageshttps://pkg.go.dev/AccesstheGoPlaygroundh......
  • pandas快速入门
    涵盖Pandas的基本主题,如创建列、数据清理等开启本学习计划,需了解基本的Python语法与常见数据结构2877.从表中创建DataFrameLeetCode-2877.从表中创建DataFrame-AisaMaral-博客园(cnblogs.com)2878.获取DataFrame的大小LeetCode-2878.获取DataFrame的......
  • 如何快速获取那些可以使用的摄像头编号
    importcv2 #导入OpenCV库#尝试检测系统中可用的摄像头索引defget_camera_indices(max_tested=10): #定义一个函数,用于检测系统中可用的摄像头索引,默认最大测试到10  available_indices=[] #初始化一个空列表,用于存储可用的摄像头索引  foriinran......
  • fps游戏如何快速定位矩阵
    fps游戏如何快速定位矩阵矩阵特点:1、第一行第一列值的范围在**-1----1**之间,如果开镜之后值会变大。2、第一行第三列的值始终为0。3、第一行第四列的值比较大,>300或者**<-300**。根据这三个特点,定位矩阵已经足够了。找到的矩阵可以有多个,根据透视的效果,使用最佳......
  • linux 快速部署jar 并加入开机自启(超方便)
    第一步cd/etc/systemd/system/第二步创建app.service可以在本地创建好在传到/etc/systemd/system/目录下/usr/bin/java需要改成自己的java环境对应地址/srv/sites/app.jar改为自己jar存放包地址[Unit]Description=appserviceAfter=syslog.target[Service]Type......
  • Windows server 2022从基础到进阶的 DNS 管理内容,适合初学者快速入门并建立起对 DNS
    关于WindowsServer2022DNS管理器初级应用的大纲:1. 介绍DNS服务1.1什么是DNS?1.2DNS的作用和重要性1.3DNS解析过程概述2. 部署DNS服务器2.1安装DNS服务器角色2.2配置DNS服务器基本设置2.3DNS服务器的启动和停止3. 管理DNS区域3.1什么......
  • mysql针对中文和数字字段进行排序
    场景1field函数的使用field(str,str1,str2,str3,str4…)字段str按照字符串1、字符串2、字符串3、字符串4的顺序返回查询到的结果集。如果表字段值str不存在,放在结果集的最前面subString如七年级1班,想要截取第一个字符,就是substring(user_name,1,1),第一个参数写字段,第二个参数......