快速排序算法

  首先看下面这个例子:

  

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

  

  之后,从右边开始与基准元素挨个比较,如果比基准元素大,右指针往左移,如果比基准元素小,就与左指针指的元素交换(因为左指针永远停留在一个

  空白的值上,不用担心值被覆盖)

  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语言实现----快速排序的更多相关文章

  1. 数据结构(C语言)—排序

    数据结构(C语言)—排序 排序 排序是按关键字的非递增或递减顺序对一组记录中心进行排序的操作.(将一组杂乱无章的数据按一定规律顺次排列起来.) 未定列表与不稳定列表 假设 Ki = Kj ( 1 ≤ ...

  2. c++学习书籍推荐《清华大学计算机系列教材:数据结构(C++语言版)(第3版)》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <清华大学计算机系列教材:数据结构(C++语言版)(第3版)>习题解析涵盖验证型.拓展型.反思型.实践型和研究型习题,总计290余道大题.525道 ...

  3. 数据结构C语言版 有向图的十字链表存储表示和实现

    /*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...

  4. 数据结构C语言版 表插入排序 静态表

    数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./*  数据结构C语言版 表插入排序  算法10.3 P267-P270  编译 ...

  5. 数据结构C语言版 弗洛伊德算法实现

    /* 数据结构C语言版 弗洛伊德算法  P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...

  6. 《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明

    <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明 先附上文档归类目录: 课本源码合辑  链接☛☛☛ <数据结构>课本源码合辑 习题集全解析  链接☛☛☛  ...

  7. Python语言数据结构和语言结构(2)

    目录 1. Python预备基础 2. Python数据类型 3. Python条件语句 4. while循环和for循环 1. Python预备基础 1.1 变量的命名   变量命名规则主要有以下几 ...

  8. 图的存储结构大赏------数据结构C语言(图)

    图的存储结构大赏------数据结构C语言(图) 本次所讲的是常有的四种结构: 邻接矩阵 邻接表 十字链表 邻接多重表 邻接矩阵 概念 两个数组,一个表示顶点的信息,一个用来表示关联的关系. 如果是无 ...

  9. 深入浅出数据结构C语言版(20)——快速排序

    正如上一篇博文所说,今天我们来讨论一下所谓的"高级排序"--快速排序.首先声明,快速排序是一个典型而又"简单"的分治的递归算法. 递归的威力我们在介绍插入排序时 ...

随机推荐

  1. VS2019无法获取本地变量或参数的值,因为它在此指令指针中不可用,可能是因为它已经被优化掉了。

    解决方法:

  2. 介绍下 npm 模块安装机制,为什么输入 npm install 就可以自动安装对应的模块?

    1. npm 模块安装机制: 发出npm install命令 查询node_modules目录之中是否已经存在指定模块 若存在,不再重新安装 若不存在 npm 向 registry 查询模块压缩包的网 ...

  3. 前端04 /css样式

    前端04 /css样式 目录 前端04 /css样式 昨日内容回顾 css引入 选择器 基础选择器 组合选择器 属性选择器 伪类选择器 伪元素选择器 优先级(权重) 通用选择器 css样式 1高度宽度 ...

  4. 02-flask项目创建及debug模式的开启

    一.flask文件的创建 打开pycharm,选择flask文件,选择相关配置,需要配置的有虚拟环境,flask文件名.如下图所示: 新建的flask文件如下所示: static:用来存放静态文件,包 ...

  5. kafka零拷贝

    Kafka之所以那么快的另外一个原因就是零拷贝(zero-copy)技术.本文我们就来了解Kafka中使用的零拷贝技术为什么那么快. 传统的文件拷贝 传统的文件拷贝通常需要从用户态去转到核心态,经过r ...

  6. 第二章: IPC机制

    这章关于进程的概念,没有深入太多,只做了解跟学习 IPC: Inter-Process Communication,进程间通信或者跨进程通信,两个进程之间进行数据交换的过程 2.1介绍 线程:CPU调 ...

  7. GPO - Backup and Restore

    Backup the GPO to a second server is very important. Restore a GPO if necessary. Note: WMI filter an ...

  8. 数据结构 | 30行代码,手把手带你实现Trie树

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法和数据结构专题的第28篇文章,我们一起来聊聊一个经典的字符串处理数据结构--Trie. 在之前的4篇文章当中我们介绍了关于博弈论的 ...

  9. C++语法小记---抽象类和接口

    抽象类和接口 C++中没有抽象类的概念 含有纯虚函数的类就是抽象类,抽象类的特点: 不能产生实例对象 只能被继承 接口是抽象类的一种特殊情况,具备以下条件的抽象类就是接口: 类中没有成员变量 所有的成 ...

  10. 想进大厂?字节跳动等独角兽公司都在招募Python工程师!(Python就是第一语言)

    在本文章中,作者通过自身经历,力求客观的谈谈个人选择学习Python的动机,以及独角兽公司对Python工程师的要求及薪资. 从目前各种迹象(企业招聘,语言排名等)看来Python相对Java应该是暂 ...