首页 > 其他分享 >快速排序详解

快速排序详解

时间:2023-12-31 09:33:05浏览次数:20  
标签:arr int 左边 基准 右边 详解 排序 快速

算法思想

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

快速排序算法通过多次比较和交换来实现排序,其排序流程如下:

1、首先设定一个基准,通过该分界值将数组分成左右两部分。

2、将大于或等于基准的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于基准。

3、然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个基准,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。

4、重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。

概括来说为 挖坑填数 + 分而治之。

算法图解

代码实现

#include <stdio.h>
#define N 10

// 函数声明
void quickSort(int arr[], int left, int right);

int main() {
// 标准的输入输出不需要缓存,直接输出
setbuf(stdout, NULL);

int arr[N] = {4, 3, 8, 2, 1, 7, 5, 6, 9, 0};

quickSort(arr, 0, N - 1);

printf("数组升序排列:");
for (int i = 0; i < N; ++i) {
printf("%d ", arr[i]);
}
printf("\n");

return 0;
}

/**
* 快速排序
*/
void quickSort(int arr[], int left, int right) {
if (left >= right) {
return;
}
int l = left, r = right;
int base = arr[left];
while (l < r) {
// 依次从右边判断元素是否比基准大,如果比基准大:右边指针往前走
while (l < r && arr[r] >= base) {
r--;
}
// 出并列的while循环:从右边比较时已经遇到比基准小的值【替换左边的值】
arr[l] = arr[r];
// 依次从左边判断元素是否比基准小,如果比基准小:左边指针往后走
while (l < r && arr[l] <= base) {
l++;
}
// 出并列的while循环:从左边比较时已经遇到比基准大的值【替换右边的值】
arr[r] = arr[l];
}
// 出并列的while循环:当前这一趟已经比较完毕,比基准大的在基准下标的右边,比基准小的在基准下标的左边
arr[r] = base;
// 递归排序左边
quickSort(arr, left, r - 1);
// 递归排序右边
quickSort(arr, r + 1, right);
}

运行结果

 

标签:arr,int,左边,基准,右边,详解,排序,快速
From: https://www.cnblogs.com/michael-study/p/17937214

相关文章

  • Python教程(18)——python文件操作详解
    所谓的文件操作是指对计算机中的文件进行读取、写入、修改和删除等操作。简单来说可以分为以下三个部分:打开文件操作文件关闭文件就是这三个简简单单的操作,却在计算机世界占有一席之地。打开文件有各种打开模式,各不相同;操作文件,有读写模式;关闭文件就比较简单了。Python文......
  • 《图解支付系统设计与实现》之详解收单结算拒付
    这是《图解支付系统设计与实现》系统文章中的第(2)篇。本章主要讲清楚支付系统中收单结算涉及的基本概念,产品架构、系统架构,以及一些核心的流程和相关领域模型、状态机设计,并顺便讲讲和收单结算非常紧密的拒付。收单结算是支付系统最重要的子域之一,行业内经常把有牌照的支付平台称为......
  • Spring 事务快速上手
    Spring事务与数据库事务关系spring事务本质上使用数据库事务,而数据库事务本质上使用数据库锁,所以spring事务本质上使用数据库锁,开启spring事务意味着使用数据库锁。spring事务是对数据库事务的封装,最后本质的实现还是在数据库,如果数据库不支持事务,spring的事务是不起作用的。数......
  • 【并发编程】CopyOnWriteArrayList详解与原理
    ......
  • EasyUI服务器与本地排序
    其他文章列表easyui有个remoteSort属性服务器排序,默认为true,设置为false则本地排序,$("#tbl").datagrid({sortName:"createDate",//定义那些列可以排序,多个列用逗号隔开sortOrder:"desc",//ascremoteSort:true,//默认为true可以不填column:......
  • 08 AXI4-FULL-MASTER IP FDMA详解
    软件版本:vitis2021.1(vivado2021.1)操作系统:WIN1064bit硬件平台:适用XILINXA7/K7/Z7/ZU/KU系列FPGA登录"米联客"FPGA社区-www.uisrc.com视频课程、答疑解惑!1概述FDMA是米联客的基于AXI4总线协议定制的一个DMA控制器。本文对AXI4-FULL总线接口进行了封装,同时定义了简单的APP......
  • 二叉排序树
    1#include<iostream>2#include<fstream>3usingnamespacestd;45structTnode6{7intdata;8Tnode*lchil,*rchil;9};1011//向二叉排序树种插入固定值的节点12voidinsert(Tnode**t,inta)13{14//如果*t所指为......
  • 数据库查询,按年月排序,计算每月、当年每月有几条数据
    数据库查询,按年月排序,计算每月有几条数据  数据库查询,按年月排序,计算当年每月有几条数据SELECTDATE_FORMAT(inspection_date,'%Y-%m')ASDATETIME,count(*)ASnumFROMgw_inspection_datat1WHEREYEAR(inspection_date)=YEAR(CURDATE())GROUPBY......
  • 拓扑排序(TopologicalSort)
    什么是拓扑排序?对一个有向无环图(DirectedAcyclicGraph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(TopologicalOrder)的序列,简称拓扑序列。简单的说,由某......
  • 数据结构应用之桶排序
    问:有10G的订单数据,希望订单金额(假设都是正整数)进行排序,但我们内存有限,只有几百MB,如何进行排序?答:因内存有限,需要排序的数据量巨大,所以,此时需要外部排序,外部排序采用的是一种分治思想,外部排序最常用的是多路归并排序,即将大数据切成多份一次可以载入内存的小数据,对小数据进行内......