数据结构C语言实现----快速排序
快速排序算法
首先看下面这个例子:

我们取第一个元素为基准元素:

之后,从右边开始与基准元素挨个比较,如果比基准元素大,右指针往左移,如果比基准元素小,就与左指针指的元素交换(因为左指针永远停留在一个
空白的值上,不用担心值被覆盖)
4的值比5小,所以左右指针的值交换,右指针就变成空的了:

一旦完成交换操作,另一个指针就要开始移动了!
(交换完成后,左指针要立刻右移一下,因为接下来判断左指针是否右移的条件是元素与基准的比较,交换完成后左指针指向的元素交换前已经比较过了)
左指针开始右移,指向的元素与基准元素比较,比基准小左指针继续右移,比基准元素大,就与右指针交换
4比5小,左指针右移:

9比5大,与右指针交换:

一旦完成交换操作,另一个指针就要开始移动了!
(交换完成后,右指针要立刻左移一下,因为接下来判断右指针是否左移的条件是元素与基准的比较,交换完成后右指针指向的元素交换前已经比较过了)
右指针开始左移,第一个元素小于基准
左右指针的值交换:

交换完成左指针应该立刻右移一位:

左指针开始右移
第一个元素0,小于基准,继续右移
下一个元素4也小于基准,继续右移
来到元素7,大于基准,指针的值交换:

交换完成后,右指针立刻左移一位:

元素8大于基准,所以右指针继续左移:

元素4小于基准,交换值:

交换完成,左指针立刻右移一下:

此时左右指针重合,重合位置放入基准元素:

让后基准元素左面都比他小,右面都比他大,左右两个子列再套用上述方法,直至排序结束!
通过分析上面的例子,我们知道,快速排序大体分这么几步:
while(左指针在右指针的左边)
{
while(右指针指向的元素大于基准)
{
右指针右移
}
//退出了上面这个循环说右指针移动到了一个小于基准的元素下面
将右指针指向的值赋值给左指针指向的值
左指针立刻右移一下
while(左指针指向的元素小于基准元素)
{
左指针右移一位
}
//退出了上面这个循环说明左指针移动到了一个大于基准的元素下面
将左指针指向的值赋值给右指针指向的值
右指针立刻左移一下
}
最后左右指针会重合,重合的位置赋值为基准元素的值;
左子列重复快速排序;
右子列重复快速排序;
运行结果:

源码如下:
#include<stdio.h>
typedef int keytype;
//快速排序
void quicksort(keytype k[] , int ArrayLeft , int ArrayRight)
{
int left = ArrayLeft;
int right = ArrayRight;
int temp = k[left]; if (left < right)
{
while (left < right)
{
while (left < right && k[right] >= temp)
{
right--;
}
//if (k[right] < temp)
{
k[left] = k[right];
left++;
} while(left < right && k[left] <= temp)
{
left++;
}
//if (k[left] > temp)
{
k[right] = k[left];
right--;
}
}
k[left] = temp;
quicksort(k,ArrayLeft,left-1);
quicksort(k,right+1,ArrayRight);
}
}
#define MAX 100
int main()
{
//读取一串数字
printf("请输入一串无序数字:");
int c;
int n = 1;
keytype k[MAX];
while ((c = getchar())!='\n')
{
k[n++] = c-'0';
}
if (c == '\n')
{
k[n] = '\0';
}
//快速排序
quicksort(k,1,n-1);
printf("这串数字从小到大为:");
for (size_t i = 1; i <= n-1; i++)
{
printf("%d",k[i]);
}
return 0;
}
数据结构C语言实现----快速排序的更多相关文章
- 数据结构(C语言)—排序
数据结构(C语言)—排序 排序 排序是按关键字的非递增或递减顺序对一组记录中心进行排序的操作.(将一组杂乱无章的数据按一定规律顺次排列起来.) 未定列表与不稳定列表 假设 Ki = Kj ( 1 ≤ ...
- c++学习书籍推荐《清华大学计算机系列教材:数据结构(C++语言版)(第3版)》下载
百度云及其他网盘下载地址:点我 编辑推荐 <清华大学计算机系列教材:数据结构(C++语言版)(第3版)>习题解析涵盖验证型.拓展型.反思型.实践型和研究型习题,总计290余道大题.525道 ...
- 数据结构C语言版 有向图的十字链表存储表示和实现
/*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...
- 数据结构C语言版 表插入排序 静态表
数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./* 数据结构C语言版 表插入排序 算法10.3 P267-P270 编译 ...
- 数据结构C语言版 弗洛伊德算法实现
/* 数据结构C语言版 弗洛伊德算法 P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...
- 《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明
<数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明 先附上文档归类目录: 课本源码合辑 链接☛☛☛ <数据结构>课本源码合辑 习题集全解析 链接☛☛☛ ...
- Python语言数据结构和语言结构(2)
目录 1. Python预备基础 2. Python数据类型 3. Python条件语句 4. while循环和for循环 1. Python预备基础 1.1 变量的命名 变量命名规则主要有以下几 ...
- 图的存储结构大赏------数据结构C语言(图)
图的存储结构大赏------数据结构C语言(图) 本次所讲的是常有的四种结构: 邻接矩阵 邻接表 十字链表 邻接多重表 邻接矩阵 概念 两个数组,一个表示顶点的信息,一个用来表示关联的关系. 如果是无 ...
- 深入浅出数据结构C语言版(20)——快速排序
正如上一篇博文所说,今天我们来讨论一下所谓的"高级排序"--快速排序.首先声明,快速排序是一个典型而又"简单"的分治的递归算法. 递归的威力我们在介绍插入排序时 ...
随机推荐
- mysql自连接和外连接知识点及相关案例
#三.自连接 #查询员工的名字.上级的名字 SELECT e.last_name, m.last_name FROM employees e JOIN employees m ON e.manager ...
- 一篇文章教会你如何将DOM转换为virtual DOM
[一.Virtual DOM简介] Virtual DOM是虚拟节点,它通过Javascript的Object对象模拟DOM中的节点,然后通过特定的render方法将其渲染成真实的DOM节点. 浏览器 ...
- day66 django进阶(2)
目录 一.choices参数(数据库字段设计常见) 二.MTV与MVC模型 三.多对多三种创建方法 1 全自动 2 纯手动 3 半自动 四.AJax 小 一.choices参数(数据库字段设计常见) ...
- spring-boot 应用 报错 No qualifying bean of type XXXXX.***Mapper
报错类型 NoSuchBeanDefinitionException.No qualifying bean of type XXXXX.***Mapper 报错信息详情 Caused by: org ...
- 有效提高java编程安全性的12条黄金法则
安全性是软件开发中最复杂,最广泛和最重要的考量之一.Java是具有许多内置安全性功能的开发平台,java在长期的发展过程中,已经经过了很多高强度的安全测试,并经常更新安全漏洞.并且Java生态系统还包 ...
- 从零开始学Electron笔记(六)
在之前的文章我们介绍了一下Electron如何通过链接打开浏览器和嵌入网页,接下来我们继续说一下Electron中的对话框 Dialog和消息通知 Notification. 在之前的文章中其实我们是 ...
- P1776 宝物筛选
题目: 正文: 啊,多重背包真恶心... 一开始我是把多重背包改成了01背包,然鹅我当时是直接1个1个的往后摞的... 参见以下代码: for(int i=1;i<=n;++i){//平平无奇的 ...
- Java冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序
冒泡排序 冒泡排序是一种简单的排序算法.它重复地走访过要排序地数列,一次比较两个元素,如果它们地顺序错误就把它们交换过来.走访数列地工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. ...
- javascript : 找到一个树型数据的一个节点及其所有父节点
如题. (function () { let tree = { "id": 0, "label": "all", "childre ...
- Web优化躬行记(1)——CSS
Web优化的对象包括页面性能.用户体验.开发效率.代码优化.网络延迟等,本系列会列举出众多常用的优化技巧,每个技巧都可深入分析,在此只做抛砖引玉. 本系列优化内容提炼于<前端面试宝典>.& ...