C语言快速排序(容易理解的完整注释+完整输出)
#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语言快速排序(容易理解的完整注释+完整输出)相关推荐
- 很容易理解的C语言快速排序算法(完整注释+完整输出)
#include <stdio.h>void quickSort(int arr[], int low, int high)//arr是传进来的数组,low和high是两个指针的预定值 { ...
- 词法分析器c语言带注释,C语言词法分析器内容说明注释完整可运行代码.doc-资源下载在线文库www.lddoc.cn...
C语言词法分析器_内容说明注释完整_可运行代码.doc 1. 实验目的及要求 本次实验通过用 C 语言 设计.编制.调试一个词法分析子程序,识别单词,实现一个 C 语言词法分析器,经过此过程可以加深对 ...
- C语言实现随机快速排序random quick sort算法(附完整源码)
随机快速排序random quick sort算法 随机快速排序random quick sort算法的完整源码(定义,实现,main函数测试) 随机快速排序random quick sort算法的完 ...
- c语言求偶数的积,《动物的多*语言》阅读理解及*
第1篇:<动物的多*语言>阅读理解及* [原文] 动物的多*语言 壬艳坤 1动物也有自已的语言.鸡鸣*吠,虎a猿b,莺c燕d,蝉e虫f--都是动物的语言.这种语言类繁多.千差万别.据说鸟类 ...
- c语言基础深入理解二
指针基础 变量回顾 既然程序中的变量只是一段存储空间的别名 , 那么是不 是必须通过这个别名才能使用这段存储空间 ? 指针本质 ? 指针在本质上也是一个变量 ? 指针需要占用一定的内存空间 ? ...
- C语言中常见的符号和注释的用法
文章目录 前言 一.换行符号\n \n的具体用法和作用 二.取地址符号& &的具体用法和作用 三.注释 注释的格式 注释的作用 注释在代码中的具体体现 总结 前言 本篇文章主要给大家讲 ...
- (十二) 完整注释的代码摘录
title: 完整注释的代码摘录 date: 2019/4/23 20:40:00 toc: true --- 完整注释的代码摘录 作者网页 #include <linux/kernel.h&g ...
- Go:go语言的认识理解、安装应用、语法使用之详细攻略
Go:go语言的认识理解.安装应用.语法使用之详细攻略 目录 go语言的认识理解 go语言的安装应用 硬件架构 操作系统 开发工具 go语言的语法使用 go语言的认识理解 Go语言是谷歌2009发布的 ...
- C语言实现动态数组dynamic array(附完整源码)
C语言实现动态数组dynamic array 数组结构体的定义 实现以下7个接口 完整头文件 完整源文件 完整 main 测试文件 数组结构体的定义 typedef struct dynamic_ar ...
最新文章
- 《JAVA练习题目8》 编写一个类Person,包含的属性和方法如下: 属性:字符串类型的名字name,字符类型的性别gender,和整型的序号number
- qt 文件 时间 倒序排列_win7电脑敬业签便签软件分类标签里的内容如何按提醒时间排列?...
- education and lectures
- python中functools_python–functools的使用 | 学步园
- Go获取年月第一天与最后一天 获取时间戳
- BugkuCTF-MISC题虎符
- 计算机应用的重要性作文,关于科技的重要性作文(通用5篇)
- 简单php网站的mysql优化小结
- 微博登录过程分析以及scrapy模拟登录微博
- iOS 自定义底部tabbar加号按钮实现方法
- 常用电子面单接口API及对接攻略(快递鸟、菜鸟、顺丰)
- android apr分析,APR分析-设计篇
- windows 实现 linux soft link,Linux中的软链接(Soft Link)和硬链接(Hard Link)的区别...
- Android各版本的版本号、版本名、API及发布时间
- 批量去除图片的黑色背景,并且统一修改图片尺寸
- 为什么吃饭的时候不说话
- Android实现mp3音频剪辑(带试听)
- 梁权财到徐闻生态工业集聚区调研
- 互联网公司产品经理要求及需要掌握的技能
- nmn吃第一天有什么感觉,吃完nmn的反应,一点点体会