快速排序分析与C语言实现

C语言——快速排序原理以及代码实现 快速排序详细讲解 阅读详情

 

  设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它 大的数都放到它后面,这个过程称为一趟快速排序。一趟快速排序的算法是:

  1)设置两个变量I、J,排序开始的时候:I=0,J=N-1;
  2)以第一个数组元素作为关键数据,赋值给X,即 X=A[0];
  3)从J开始向前搜索,即由后开始向前搜索(J=J-1),找到第一个小于X的值a[j]; 
  4)从I开始向后搜索,即由前开始向后搜索(I=I+1),找到第一个大于X的值 a[i];        5)  交换a[i]和a[j]的值;
  6)重复第3、4、5步,直到 I=J; (3,4步是在程序中没找到时候j=j-1,i=i+1。找到并交换的时候i, j指针位置不变。另外当i=j这过程一定正好是i+或j+完成的最后另循环结束)
  例如:待排序的数组A的值分别是:(初始关键数据:X=49) 注意关键X永远不变.永远是和X进行比较 无论在什么位子 最后的目的就是把X放在中间小的放前面大的放后面
  A[0] 、 A[1]、 A[2]、 A[3]、 A[4]、 A[5]、 A[6]:
  49 38 65 97 76 13 27
  进行第一次交换后: 27 38 65 97 76 13 49
  ( 按照算法的第三步从后面开始找)
  进行第二次交换后: 27 38 49 97 76 13 65
  ( 按照算法的第四步从前面开始找>X的值,65>49,两者交换,此时:I=3 )
  进行第三次交换后: 27 38 13 97 76 49 65
  ( 按照算法的第五步将又一次执行算法的第三步从后开始找
  进行第四次交换后: 27 38 13 49 76 97 65
  ( 按照算法的第四步从前面开始找大于X的值,97>49,两者交换,此时:J=4 )
  此时再执行第三步的时候就发现I=J,从而结束一趟快速排序,那么经过一趟快速排序之后的结果 是:27 38 13 49 76 97 65,即所以大于49的数全部在49的后面,所以小于49的数全部在49的前面。
  快速排序就是递归调用此过程——在以49为中点分割这个数据序列,分别对前面一部分和后面一部 分进行类似的快速排序,从而完成全部数据序列的快速排序,最后把此数据序列变成一个有序的序列,根据这种思想对于上述数组A的快速排序的全过程如图6所 示:
  初始状态 {49 38 65 97 76 13 27}
  进行一次快速排序之后划分为 {27 38 13} 49 {76 97 65}
  分别对前后两部分进行快速排序 {27 38 13} 经第三步和第四步交换后变成 {13 27 38} 完成排序。
  {76 97 65} 经第三步和第四步交换后变成 {65 76 97} 完成排序。

 

 

C中的快速排序源代码

  //参照《数据结构》(C语言版)
  //调用:quicksort-->qsort-->partions
  int partions(int a[],int low,int high)
  {
  int pivotkey=a[low];
  a[0]=a[low];
  while(low<high)
  {
  while(low<high && a[high]>=pivotkey)
  --high;
  a[low]=a[high];
  while(low<high && a[low]<=pivotkey)
  ++low;
  a[high]=a[low];
  }
  a[low]=a[0];
  return low;
  }
  void qsort(int a[],int low,int high)
  {
  int pivottag;
  if(low<high)
  { //递归调用
  pivottag=partions(a,low,high);
  qsort(a,low,pivottag-1);
  qsort(a,pivottag+1,high);
  }
  }
  void quicksort(int a[],int n)
  {
  qsort(a,1,n);
  }
  //简单示例
  #include <stdio.h>
  #include <math.h>
  #include “myfunc.h” //存放于个人函数库中
  main()
  {
  int i,a[11]={0,11,12,5,6,13,8,9,14,7,10};
  for(i=0;i<11;printf(“%3d”,a[i]),++i);
  printf(“/n”);
  quicksort(a,10);
  for(i=0;i<11;printf(“%3d”,a[i]),++i);

  }

快速排序(快排) (C语言实现) 本篇博客学习内容是快速排序,快速排序有多种不同的版本和优化,我们这次的目的就是将这些版本都搞明白,废话不多说,我们开始。 阅读详情

相关推荐

数据结构实验—C语言实验—快速排序

#include <stdio.h> int Partition(int a[], int low, int high) { int pivot = a[low]; while (low < high) { while (low < high && a[high] >= pivot) high--; a[low] = a[high]; while (low < high && a[low] <= pivot) low

weixin_42543048的博客 621

快速排序(C语言)

中文名:快速排序英文名:quick sort时间复杂度:O(nlog2n)稳定性:不稳定性的排序算法(多个相同的值的相对位置在也许会在算法结束后位置发生改变)原理:将数组的第一个(最后一个)数组元素a,作为关键数据,将比a小的数字b放到a的左边(右边),所有比a小的数字b放到a的右边(左边),快速排序是对冒泡排序的的优化。

m0_64681789的博客 1万+

C语言实现快速排序(附完整源码)

C语言实现快速排序(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 272

c语言快速排序算法总结(详解)

【代码】c语言快速排序算法总结(详解)

qq_45973003的博客 1025

快速排序算法的C语言实现与分析

分治法(Divide and Conquer)是一种重要的算法设计范式,它将原问题分解成一系列子问题,然后递归地解决这些子问题,最后将子问题的解合并成原问题的解。分治法的核心思想是将问题划分成可管理的小块,分别解决它们,然后将结果组合起来。在排序算法中,分治法常用于将大数组分为几个小数组,然后对每个小数组进行排序,最后将它们合并。这种方法在快速排序、归并排序和堆排序中都得到了广泛应用。在算法分析中,分治法的效率取决于如何划分问题、解决子问题以及合并子问题的解。

weixin_35189483的博客 318

六种排序算法C语言实现源代码

冒泡排序、插入排序、归并排序、快速排序、希尔排序、选择排序的C语言实现源代码。内附注释说明。

c语言简单快速排序原理,快速排序原理、复杂度分析及C语言实现

快速排序是一种最坏情况时间复杂度为的排序算法。虽然最坏情况的时间复杂度很差,在在实际应用中是最好的选择,平均性能很好:期望时间复杂度,而且隐含的常数因子非常小。另外,它还能够进行原排序,在虚拟环境中也能很好工作。基于随机抽样的快速排序算法,在输入元素互异的情况下,期望运行时间为。1.基本思想快速排序利用了分治策略。分治策略可以分为3个步骤:分解:将问题划分为一些子问题,子问题的形式与原问题一样,只...

weixin_29887021的博客 1129

基于C语言的快速排序法源代码quick.c

快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。 步骤为: 从数列中挑出一个元素,称为“基准”(pivot), 重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任何一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。 递归地(recursively)把小于基准值元素的子数列和大于基准值元素的子数列排序。 递归到最底部时,数列的大小是零或一,也就是已经排序好了。这个算法一定会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

C语言实现快速排序及快速排序的优化和分析

C语言实现快速排序及快速排序的优化,超详细讲解看完包会

weixin_62244902的博客 1907

ADRC自抗扰控制:工程抗扰“黑科技”,附C代码实战!

自抗扰控制(ADRC)是一种革新性的强鲁棒控制策略,通过主动估计和补偿系统扰动,无需精确数学模型即可实现优异控制性能。本文详细解析ADRC三大核心组件:跟踪微分器(TD)实现指令柔化,扩张状态观测器(ESO)实时估计总扰动,非线性状态反馈(NLSEF)完成动态补偿。针对二阶系统,文章提供完整的参数设计方法和C语言实现框架,包括关键函数fhan和fal的代码实现。ADRC将复杂对象"线性化"为积分器串联系统,显著提升抗扰能力,特别适用于电机控制、飞行器姿态等存在模型不确定性和强干扰的场景。

技术工作者 1736

从零到英雄:Spring Boot 微服务架构全攻略

在数字化转型的时代,微服务架构已成为构建可扩展、高可用系统的首选方案。本文以“从零到英雄”为主题,详细指导读者使用Spring Boot快速构建微服务帝国。从基础环境搭建入手,逐步深入到服务发现、配置管理、负载均衡、断路器、API网关、安全认证、监控与部署等核心模块。通过大量代码示例和详细解释,包括中文注释,帮助初学者和中级开发者掌握Spring Boot的核心概念和技术实践。文章强调实际操作,涵盖RESTful API开发、数据库集成、容器化部署等内容,并讨论常见问题与优化策略。无论你是Java开发者还是

一个被知识诅咒的人 2700

C语言8大排序算法以及复杂度分析,算法笔记 | 快速排序的代码实现和复杂度分析...

快速排序的代码实现和复杂度分析1. 原理简介快速排序是冒泡排序的一种改进算法,由C. A. R. Hoare在1960年提出。其基本思想是通过一趟排序将数据切割成两部分,两部分数据以某个值为划分点。一部分全部大于此划分点,一部分全部小于此划分点。这样的划分点又称为Pivot。基本流程如下:设定一划分值将数组分为两部分将大于此划分值的数据全部放到右边,小于此划分值的全部放到左侧对两侧的数据分别独立排...

weixin_39639600的博客 305

CATIA二次开发CAA:(一)开发环境搭建

CATIA+CAA+RADE+VS2012

ysm1987的博客 1万+

C语言实现快速排序及快速排序的优化和分析_c 高效排序

前面我们为了方便,都是选择数组的第一个元素当作关键字,这么随意肯定会有不好的地方,例如刚刚的待排序数组变成了arr[] = { 1,26,7,56,34,23,77,87,22,43,16,66 },若我们选择了第一个元素1,和选择其它任何一个数相比,很明显选择1就会显得很不合理,所以我们刚开始选择的关键字对我们排序速度的快慢有很大的影响。反正到最后,low和high都会同时指向关键字的下标,这时再把关键字的值还给它就得了。无序数组 26,1,7,56,34,23,77,87,22,43,16,66。

m0_61499908的博客 824

面向网络攻击行为可视化分析系统实现【WebSocket + 可视化】

本系统主要应用于网站运维管理,它解决了网站运维人员排查网络攻击行为复杂且繁琐等问题,提高了运维人员网络安全分析的效率和准确性。

oNew_Lifeo的博客 1622

Python数据爬取超详细讲解(零基础入门,老年人都看的懂)

Python数据爬取超详细讲解(零基础入门,老年人都看的懂)

python03011的博客 3754

PAT 1045快速排序的代码实现及错误分析(C语言)

题目 著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边。 给定划分后的N个互不相同的正整数的排列,请问有多少个元素可能是划分前选取的主元? 例如给定N = 5, 排列是1、3、2、4、5。则: 1的左边没有元素,右边的元素都比它大,所以它可能是主元;\ 尽管3的左边元素都比它小,但是它右边的...

bawangtu的博客 1363

WSL2不能上网,Failed to connect to github.com port 443问题解决方案

WSL2不能上网: 问题:ping外网无效 例如:ping www.baidu.com失败 解决方案: 在wsl: $sudo vi /etc/wsl.conf wsl.conf: [network] generateResolvConf = false 在PowerShell: $sudo vi /etc/etc/resolv.conf resolv.conf: # This file was automatically generated by WSL. To stop automatic gen

Jason_Chen__的博客 9527

C语言中快速排序法(从小到大)实现过程详细分析

快速排序法:实际上是对冒泡排序法的一种改进。 算法:是描述求解问题方法的操作步骤集合。 快速排序法这一算法的基本思想是:首先设定一个分界值(一般是数组中的起始元素值),通过该分界值将数组的元素值分成左右两部分(这里是把数组元素值从小到大排序,所以将大于分界值的数组元素值分到右边,小于分界值的数组元素值分到左边)。同理,分别对左右两部分的数组元素值重复上述步骤:设定起始元素值为分界值,将大于分界值的数组元素值分到右边,小于分界值的数组元素值分到左边,最后实现数组元素值从小到大排序。上述过程实际上就是算法的递归

热爱学习 4512

告别地图偏移!手把手教你用MapOnline V1.2在ArcGIS里加载无偏谷歌影像和历史影像

本文详细介绍了如何使用MapOnline V1.2插件在ArcGIS中加载无偏谷歌影像和历史影像,解决GIS工程师长期面临的地图偏移问题。通过三步安装配置、无偏影像加载和时空分析功能,提升地理信息数据的精确度和工作效率,特别适用于城市规划、环境监测等场景。

weixin_29252171的博客 232

数字电视中的 Closed Caption (CC) 字幕标准协议

本文将详细介绍 DVB中的 CC 字幕标准协议,包括数据结构格式、字段定义、字段占用比特数以及字段用途。此外,本文还将举例说明如何从 TS 传输流中解析 CC 字幕信息,并组织打包到电视节目中进行显示。

以实战经验介绍行业知识 670

算法分析:基于划分算法的快速排序C语言实现

快速排序,在最坏的情况下,算法QUICKSORT 的运行时间是0(n²),然而如果总是选择中项作为主元,它的时间复杂性是O(nlog n)。多余的也不多说了,书上都有!直接上代码! #include <stdio.h> #include <stdlib.h> /* 将5设为比较元素,每次比较都需要这个元素,再用j做寻找元素,j每找到一个比5小的数,则i++,并且交换比较过的元素。最后跳出循环,将比较元素与最后i的位置进行交换 1. 5 7...

Coolstuz的博客 499

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

最全C语言实现快速排序及快速排序的优化和分析_c 高效排序,2024年最新C C++程序员必备

前面我们为了方便,都是选择数组的第一个元素当作关键字,这么随意肯定会有不好的地方,例如刚刚的待排序数组变成了arr[] = { 1,26,7,56,34,23,77,87,22,43,16,66 },若我们选择了第一个元素1,和选择其它任何一个数相比,很明显选择1就会显得很不合理,所以我们刚开始选择的关键字对我们排序速度的快慢有很大的影响。我们只需在把数组分成左右两部分之前,将关键字备份一份,然后在排序的过程中,数字间的交换直接改成赋值,会少了很多交换的步骤。这样我们就减少了递归的次数,速度大大提高!

2401_84976386的博客 379

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

快速排序算法(c语言算法实现)-------精简原理分析

一般来说,冒泡法是程序员最先接触的排序方法,它的优点是原理简单,编程实现容易,但它的缺点就是--程序的大忌--速度太慢。下面我介绍一个理解上简单但编程实现上不是太容易的排序方法,我不知道它是不是现有排序方法中最快的,但也不错。排序同样的数组,它所需的时间只有冒泡法的 4% 左右。我暂时称它为“快速排序法”。    “快速排序法”使用的是递归原理,下面我结合一个例子来说明“快速排序法”的原理。首

tgh7934418715的专栏 2万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

深入解析C语言三路快速排序算法

传统快速排序采用二路划分:选择一个基准值(pivot)将数组分为两部分:小于等于基准值的元素和大于基准值的元素c// 传统二路快排分区函数j < high;j++) {i++;return i;问题:当数组包含大量重复元素时,会导致分区不平衡,递归深度增加,性能退化到O(n²)。

hello world/linux 1383
上一篇: Symbian中卡拉OK字幕实现
下一篇: Qt Symbian 开发环境安装
landerluu
博客等级 码龄20年 22粉丝 13原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值