#include <stdio.h>void quickSort(int arr[], int low, int high)//arr是传进来的数组,low和high是两个指针的预定值
{int k;int head = low;//头针值int tail  = high;//尾针值int PivotKey = arr[head];//设定标定为头指针if(low >= high)return;printf("本次循环开始前,Head/tail/PivotKey(arr_head)的值分别为%d,%d,%d.循环开始.\n",head,tail,PivotKey);while(head < tail)//当头指针小于尾指针(正常情况下){//反向扫描,后往前扫描一次,如果是正序则尾指针-1,这是个循环.直到不满足才执行arr[head] = arr[tail];while(head < tail && arr[tail] > PivotKey)//这里有一个点就是条件是"与",即此时比较的可以是head,也可以是arr[tail],{printf("改变前的tail指针位置为:%d,\n",tail);tail--;printf("改变后的tail指针位置为:%d,\n",tail);}arr[head] = arr[tail];//将tail的值向前交换,但是tile本身不动.此时arr[head]的值还在PivotKey中printf("第一个循环将tail值(%d)给了head,此时的数组为:",tail);for(k = 0; k < 5; k++) printf("%d ", arr[k]); printf("\n");printf("此时的PivotKey(arr_head)的值为%d.反向循环执行完.\n",PivotKey);//正向扫描,前往后扫描一次,如果是正序则头指针+1,这是个循环.直到不满足才执行arr[tail] = arr[head];while(head < tail && arr[head] < PivotKey)这里有一个点就是条件是"与",即此时比较的可以是head,也可以是arr[head],因为arr[head]还是没有被替换的原来的值,所以比较依然可以成功{printf("改变前的head指针位置为%d,\n",head);head++;printf("改变后的head指针位置为%d,\n",head);}arr[tail] = arr[head];//此时while条件不满足了,说明反序了,执行交换,此时PivotKey中的值被赋给后面的tail.printf("第二个循环将head值(%d)给了tail.此时的数组为:",head);for(k = 0; k < 5; k++) printf("%d ", arr[k]); printf("\n");printf("此时的PivotKey(arr_head)的值为%d.正向循环执行完.\n",PivotKey);printf("本次循环结束时,Head/tail/PivotKey(arr_head)的值分别为%d,%d,%d.\n",head,tail,PivotKey);}//此时head<tail条件不满足,退出一次循环arr[head] = PivotKey;printf("本次排序结束,此时PivotKey被重新赋值为:%d\n",PivotKey);for(k = 0; k < 5; k++)printf("%d ", arr[k]);printf("\n");printf("\n");quickSort(arr, low, head-1);//继续排序算法,此算法结束后左区间有序quickSort(arr, head+1, high);//继续排序算法,此算法结束后又区间有序,整个算法完成.(这两个递归如果条件满足会被持续调用)
}int main()
{int i;int a[5] = { 2, 0, 9,1,8};for(i = 0; i < 5; i++)printf("%d ", a[i]);printf("\n");quickSort(a, 0, 4);for(i = 0; i < 5; i++)printf("%d ", a[i]);printf("\n");return 0;
}

运行结果为:

2 0 9 1 8
本次循环开始前,Head/tail/PivotKey(arr_head)的值分别为0,4,2.循环开始.
改变前的tail指针位置为:4,
改变后的tail指针位置为:3,
第一个循环将tail值(3)给了head,此时的数组为:1 0 9 1 8
此时的PivotKey(arr_head)的值为2.反向循环执行完.
改变前的head指针位置为0,
改变后的head指针位置为1,
改变前的head指针位置为1,
改变后的head指针位置为2,
第二个循环将head值(2)给了tail.此时的数组为:1 0 9 9 8
此时的PivotKey(arr_head)的值为2.正向循环执行完.
本次循环结束时,Head/tail/PivotKey(arr_head)的值分别为2,3,2.
改变前的tail指针位置为:3,
改变后的tail指针位置为:2,
第一个循环将tail值(2)给了head,此时的数组为:1 0 9 9 8
此时的PivotKey(arr_head)的值为2.反向循环执行完.
第二个循环将head值(2)给了tail.此时的数组为:1 0 9 9 8
此时的PivotKey(arr_head)的值为2.正向循环执行完.
本次循环结束时,Head/tail/PivotKey(arr_head)的值分别为2,2,2.
本次排序结束,此时PivotKey被重新赋值为:2
1 0 2 9 8

本次循环开始前,Head/tail/PivotKey(arr_head)的值分别为0,1,1.循环开始.
第一个循环将tail值(1)给了head,此时的数组为:0 0 2 9 8
此时的PivotKey(arr_head)的值为1.反向循环执行完.
改变前的head指针位置为0,
改变后的head指针位置为1,
第二个循环将head值(1)给了tail.此时的数组为:0 0 2 9 8
此时的PivotKey(arr_head)的值为1.正向循环执行完.
本次循环结束时,Head/tail/PivotKey(arr_head)的值分别为1,1,1.
本次排序结束,此时PivotKey被重新赋值为:1
0 1 2 9 8

本次循环开始前,Head/tail/PivotKey(arr_head)的值分别为3,4,9.循环开始.
第一个循环将tail值(4)给了head,此时的数组为:0 1 2 8 8
此时的PivotKey(arr_head)的值为9.反向循环执行完.
改变前的head指针位置为3,
改变后的head指针位置为4,
第二个循环将head值(4)给了tail.此时的数组为:0 1 2 8 8
此时的PivotKey(arr_head)的值为9.正向循环执行完.
本次循环结束时,Head/tail/PivotKey(arr_head)的值分别为4,4,9.
本次排序结束,此时PivotKey被重新赋值为:9
0 1 2 8 9

C语言快速排序(容易理解的完整注释+完整输出)相关推荐

  1. 很容易理解的C语言快速排序算法(完整注释+完整输出)

    #include <stdio.h>void quickSort(int arr[], int low, int high)//arr是传进来的数组,low和high是两个指针的预定值 { ...

  2. 词法分析器c语言带注释,C语言词法分析器内容说明注释完整可运行代码.doc-资源下载在线文库www.lddoc.cn...

    C语言词法分析器_内容说明注释完整_可运行代码.doc 1. 实验目的及要求 本次实验通过用 C 语言 设计.编制.调试一个词法分析子程序,识别单词,实现一个 C 语言词法分析器,经过此过程可以加深对 ...

  3. C语言实现随机快速排序random quick sort算法(附完整源码)

    随机快速排序random quick sort算法 随机快速排序random quick sort算法的完整源码(定义,实现,main函数测试) 随机快速排序random quick sort算法的完 ...

  4. c语言求偶数的积,《动物的多*语言》阅读理解及*

    第1篇:<动物的多*语言>阅读理解及* [原文] 动物的多*语言 壬艳坤 1动物也有自已的语言.鸡鸣*吠,虎a猿b,莺c燕d,蝉e虫f--都是动物的语言.这种语言类繁多.千差万别.据说鸟类 ...

  5. c语言基础深入理解二

    指针基础 变量回顾 既然程序中的变量只是一段存储空间的别名 , 那么是不 是必须通过这个别名才能使用这段存储空间 ? 指针本质 ?  指针在本质上也是一个变量 ?  指针需要占用一定的内存空间 ?   ...

  6. C语言中常见的符号和注释的用法

    文章目录 前言 一.换行符号\n \n的具体用法和作用 二.取地址符号& &的具体用法和作用 三.注释 注释的格式 注释的作用 注释在代码中的具体体现 总结 前言 本篇文章主要给大家讲 ...

  7. (十二) 完整注释的代码摘录

    title: 完整注释的代码摘录 date: 2019/4/23 20:40:00 toc: true --- 完整注释的代码摘录 作者网页 #include <linux/kernel.h&g ...

  8. Go:go语言的认识理解、安装应用、语法使用之详细攻略

    Go:go语言的认识理解.安装应用.语法使用之详细攻略 目录 go语言的认识理解 go语言的安装应用 硬件架构 操作系统 开发工具 go语言的语法使用 go语言的认识理解 Go语言是谷歌2009发布的 ...

  9. C语言实现动态数组dynamic array(附完整源码)

    C语言实现动态数组dynamic array 数组结构体的定义 实现以下7个接口 完整头文件 完整源文件 完整 main 测试文件 数组结构体的定义 typedef struct dynamic_ar ...

最新文章

  1. 《JAVA练习题目8》 编写一个类Person,包含的属性和方法如下: 属性:字符串类型的名字name,字符类型的性别gender,和整型的序号number
  2. qt 文件 时间 倒序排列_win7电脑敬业签便签软件分类标签里的内容如何按提醒时间排列?...
  3. education and lectures
  4. python中functools_python–functools的使用 | 学步园
  5. Go获取年月第一天与最后一天 获取时间戳
  6. BugkuCTF-MISC题虎符
  7. 计算机应用的重要性作文,关于科技的重要性作文(通用5篇)
  8. 简单php网站的mysql优化小结
  9. 微博登录过程分析以及scrapy模拟登录微博
  10. iOS 自定义底部tabbar加号按钮实现方法
  11. 常用电子面单接口API及对接攻略(快递鸟、菜鸟、顺丰)
  12. android apr分析,APR分析-设计篇
  13. windows 实现 linux soft link,Linux中的软链接(Soft Link)和硬链接(Hard Link)的区别...
  14. Android各版本的版本号、版本名、API及发布时间
  15. 批量去除图片的黑色背景,并且统一修改图片尺寸
  16. 为什么吃饭的时候不说话
  17. Android实现mp3音频剪辑(带试听)
  18. 梁权财到徐闻生态工业集聚区调研
  19. 互联网公司产品经理要求及需要掌握的技能
  20. nmn吃第一天有什么感觉,吃完nmn的反应,一点点体会

热门文章

  1. 网上下单的手机流量卡有哪些你不知道的“秘密”?
  2. A米、巴萨、coder
  3. 在IDEA中使用preparestatement,使用setdate出错的问题
  4. Keras Recurrent Layers 解析
  5. UE5虚幻引擎5创建风格化的VFX游戏特效视频教程-Niagara和Substance Designer工作流
  6. ROS机器人仿真(Ackermann 转向机构)
  7. thymeleaf html 格式化时间 格式化日期
  8. 开车打电话用什么蓝牙耳机好?司机蓝牙耳机推荐
  9. 2021 安卓逆向学习思路
  10. C#-FFmpeg-视频文件转gif