快速排序

快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:经过一趟排序将要排序的数据分割成独立的两部分,其中一部分的全部数据都比另一部分的全部数据都要小,而后再按此方法对这两部分数据分别进行快速排序,整个排序过程能够递归进行,以此达到整个数据变成有序序列。是对冒牌排序的一种改进web

快速排序的平均时间复杂度为O(nlogn),是一种不稳定的排序算法,排序效率最高算法

快排思路(从小到大):

首先有 N 个待排序的数据,a[N] ,选择第一个数据做为哨兵(key,一般都是第一个),经过一趟排序将区间内比哨兵(key)大的数所有放到哨兵(key)后面,将区间内比哨兵(key)小的数所有放到哨兵(key)前面,这样就能够将原区间划分为两个区间,即哨兵(key)前、后的两个区间,而后对这两个区间分别进行上面的步骤,即从新选定哨兵(key),再划分区间,直到区间的数据只有一个为止

一、定义两个变量 i 和 j ,i = 0,j=N-1

二、选定哨兵(key),key=a[i]

三、从后面开始往前进行搜索,即从 j 的位置开始,进行 --j; 找到一个小于key的值a[j] 或者是 i== j 中止,将 j 位置上的数据赋值给 i 位置上,即a[i] = a[j]

四、再从前面开始日后进行搜索,即从 i 的位置开始,进行 ++i;找到一个大于key的值a[i] 或者是 i==j 中止,将 i 位置上的数据赋值给 j 位置上,即a[j]=a[i]

五、重复三、4步骤,直到区间数据只有一个为止(一个数据已是排好序的)svg

原序列:code

下标

0

1

2

3

4

5

6

7

8

9

数据

5

3

8

6

0

9

1

7

4

2

建立变量 i 、 j 、 key,i = 0(指向第一个数据),j=9(指向最后一个数据),key=a[i],即a[0]当作哨兵,而后从后往前开始寻找比key小的数,移动到key的前面,不断递减j的值,找到一个比5小的数是9号位的数据2,此时i=0,j=9,而后执行a[i]=a[j]xml

0

1

2

3

4

5

6

7

8

9

2

3

8

6

0

9

1

7

4

2

接着进行第二次的寻找,从前日后寻找比key大的数,移动到key的后面,不断递增i的值,找打一个比5大的数是2号位的数据8,此时i=2;j=9;而后执行a[j]=a[i]blog

0

1

2

3

4

5

6

7

8

9

2

3

8

6

0

9

1

7

4

8

第三次寻找从后往前寻找比key小的数,移动到key的前面,不断递减j的值,找到一个比5小的数是8号位的数据4,此时i=2;j=8;执行a[i]=a[j]排序

0

1

2

3

4

5

6

7

8

9

2

3

4

6

0

9

1

7

4

8

第四次寻找从前日后寻找比key大的数,移动到key的后面,不断递增i的值,找到一个比5大的数是3号位置的数6,此时i=3;j=8;执行a[j]=a[i]递归

0

1

2

3

4

5

6

7

8

9

2

3

4

6

0

9

1

7

6

8

依次类推,不断进行上面的循环比较,最后将key放到中间的位置,这里是5号位,5号位前面的都比5小,后面的数都比5要打,通过一趟比较以后获得的结果为图片

0

1

2

3

4

5

6

7

8

9

2

3

4

1

0

5

9

7

6

8

注意:一趟的比较结果是不会得出最终的结果,获得的结果是把比key大的和比key小的分到key的两边而已,须要再次对下标5两边的区间当作两个新的序列,分别进行上述操做,此过程是一个递归的过程,直到区间的数据只有一个为止(不能进行比较了,由于一个数已是有序的),这样通过必定的趟数以后,才能获得最终的结果it

C语言实现

#include

#define N 10

/*快速排序*/

void Qsort(int *a,int low ,int high)

{

if(low>=high)

return ;

printf("start:%d end:%d\n",low,high) ;

int first = low ;

int last = high ;

int key = a[low] ;

while(first

{

while(first=key)

--last ;

a[first] = a[last] ;

while(first

++first ;

a[last] = a[first] ;

}

a[first] = key ;

Qsort(a,low,first-1) ;

Qsort(a,first+1,high) ;

}

int main(void)

{

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

int i;

printf("原来序列:") ;

for(i=0;i

printf("%d ",a[i]) ;

printf("\n\n") ;

/*快速排序*/

printf("每次排序的区间为:\n") ;

Qsort(a,0,N-1) ;

printf("\n排后序列:") ;

for(i=0;i

printf("%d ",a[i]) ;

printf("\n") ;

return 0 ;

}

c语言快排过程,快速排序(快排)C语言实现相关推荐

  1. c语言在面向过程有啥特点,C语言是什么

    C语言是一种高级编程语言,程序员大多使用C语言用于底层的开发,并且适合开发固态等应用程序,C语言主要是提供一种简单的编译,存储器,并且是不需要任何环境就能运行的语言. 本文操作环境:Windows7系 ...

  2. r语言 rgl 强制过程中_一个R语言中操纵矢量空间数据的标准化工具—sf

    ​注: 本文是R语言sf包的核心开发者和维护者--来自德国明斯特大学的地理信息学教授:Edzer Pebesma 的一篇关于sf包的简介,发表于2018年7月的R语言期刊,主要讲述了sf的定位.功能. ...

  3. C语言的编译过程常见的错误和警告

    C语言的编译过程: 一. C语言编译过程 C语言的编译过程可分为四个阶段: 1.预处理(Preprocessing) 对源程序中的伪指令(即以#开头的指令)和特殊符号进行处理的过程. 伪指令包括:1) ...

  4. 分治法:快速排序,3种划分方式,随机化快排,快排快,还是归并排序快?

    快速排序不同于之前了解的分治,他是通过一系列操作划分得到子问题,不同之前的划分子问题很简单,划分子问题的过程也是解决问题的过程 我们通常划分子问题尽量保持均衡,而快排缺无法保持均衡 快排第一种划分子问 ...

  5. 算法——java快排(快速排序)

    手写java快排(快速排序)代码--双边循环法,本人亲测哈哈!! package com.abc.backend.algo;import java.util.Arrays;/*** 快排(双边循环法) ...

  6. 快排和归并排序--快排处理第k大元素

    快排和归并排序 归并排序 归并排序性能分析 归并排序是稳定的排序算法吗 归并排序时间复杂度 空间复杂度 快排 归并排序对比快排 快排处理第k大元素 冒泡.插入.排序这些排序时间复杂度都是 O(n2), ...

  7. 数学之美番外篇:快排为什么那样快

    目录 0. 前言 1. 猜数字 2. 称球 3. 排序 3.1 为什么堆排比快排慢 3.2 为什么快排其实也不是那么快 3.3 基排又为什么那么快呢 4. 信息论!信息论? 5. 小结 0. 前言 知 ...

  8. 快排为什么那样快(转)

    快排为什么那样快(转) 快排为什么那样快(转) - Bit By Bit 快排为什么那样快(转) 文章作者:Titi    0 条评论 From http://mindhacks.cn/2008/06 ...

  9. 快排为什么那样快-发现数学之美

    1. 猜数字 我们先来玩一个猜数字游戏:我心里默念一个1~64之间的数,你来猜(你只能问答案是"是"或"否"的问题).为了保证不论在什么情况下都能以尽量少的次数 ...

最新文章

  1. 多线程并发的解决方案 volatile synchronized notify notifyAll wait关键字分析
  2. 2021年春季学期-信号与系统-第二次作业参考答案-第三小题
  3. Tensorflow官方文档中文版——第一章
  4. OpenCASCADE:形状愈合之形状加工
  5. 【测试点分析】1072 开学寄语 (20分)_42行代码AC
  6. python做请求转发_RequestDispatcher实现请求转发
  7. 鬼使神差的给宝宝办了大米的卡
  8. Win10应用商店被卸载的恢复方法
  9. JAVA学习导图、思维导图
  10. HTML5地理位置定位API接口开发
  11. 大厂必考深度学习算法面试题
  12. git切换分支、push或pull指定分支
  13. VMware虚拟化方案之备份ESXi虚拟机
  14. win2003 启用了Internet Explorer增强的安全配置
  15. redis 两台服务器组集群
  16. Saas发展史常用架构
  17. mac更改管理员密码
  18. 高性能网站 首屏渲染速度
  19. 手机看小说时如何设置上下或左右翻页模式
  20. 仅拍125个视频就成为千万级网红? Python告诉你:李子柒的网红路

热门文章

  1. go语言黑帽子学习3
  2. springboot+特色农产品电商平台 毕业设计-附源码211515
  3. 【文本标注】文本标注工具brat的使用
  4. 华为5500网络限流配置_华为USG防火墙综合解决方案
  5. 【Pygame实战】末世来临,真正从零开始的残酷生存游戏,你能活多久?
  6. AS使用Viewbinding出现Could not find method buildFeatures() for arguments报错
  7. uniapp 使用支付宝扫码插件
  8. lan的以太网标准_并非所有以太网电缆都是平等的:通过升级,您可以获得更快的LAN速度...
  9. error ‘defineProps‘ is not defined no-undef
  10. 四种最常见路由协议 RIP、IGRP、OSPF和EIGRP。