排序算法-快速排序(入门)
本文出自 “啊哈磊” 博客,请务必保留此出处http://ahalei.blog.51cto.com/4767671/1362789
方法其实很简单:分别从初始序列“6 1 2 7 9 3 4 5 10 8”两端开始“探测”。先从右往左找一个小于6的数,再从左往右找一个大于6的数,然后交换他们。这里可以用两个变量i和j,分别指向序列最左边和最右边。我们为这两个变量起个好听的名字“哨兵i”和“哨兵j”。刚开始的时候让哨兵i指向序列的最左边(即i=1),指向数字6。让哨兵j指向序列的最右边(即j=10),指向数字8。
![](http://bbs.ahalei.com/data/attachment/forum/201402/26/094811yilrz1tkzkvlrriz.png)
![](http://bbs.ahalei.com/data/attachment/forum/201402/26/095430axy0qkhxxkktkktk.png)
![](http://bbs.ahalei.com/data/attachment/forum/201402/26/095437kdandfxhbtokk2qh.png)
现在交换哨兵i和哨兵j所指向的元素的值。交换之后的序列如下。
![](http://bbs.ahalei.com/data/attachment/forum/201402/26/095448k1kevwlz41373e7k.png)
![](http://bbs.ahalei.com/data/attachment/forum/201402/26/095458ejza15wscjv7iw5c.png)
![](http://bbs.ahalei.com/data/attachment/forum/201402/26/095506uz7e1uuukcblhkxv.png)
![](http://bbs.ahalei.com/data/attachment/forum/201402/26/095514cag5fumuqqg5jnsw.png)
![](http://bbs.ahalei.com/data/attachment/forum/201402/26/095530e0jf6p0y6aaaw2ir.png)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
#include <stdio.h>
int a[101],n; //定义全局变量,这两个变量需要在子函数中使用
void quicksort( int left, int right)
{
int i,j,t,temp;
if (left>right)
return ;
temp=a[left]; //temp中存的就是基准数
i=left;
j=right;
while (i!=j)
{
//顺序很重要,要先从右边开始找
while (a[j]>=temp && i<j)
j--;
//再找右边的
while (a[i]<=temp && i<j)
i++;
//交换两个数在数组中的位置
if (i<j)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
//最终将基准数归位
a[left]=a[i];
a[i]=temp;
quicksort(left,i-1); //继续处理左边的,这里是一个递归的过程
quicksort(i+1,right); //继续处理右边的 ,这里是一个递归的过程
}
int main()
{
int i,j,t;
//读入数据
scanf ( "%d" ,&n);
for (i=1;i<=n;i++)
scanf ( "%d" ,&a[i]);
quicksort(1,n); //快速排序调用
//输出排序后的结果
for (i=1;i<=n;i++)
printf ( "%d " ,a[i]);
getchar (); getchar ();
return 0;
}
|
1061279345108
12345678910
1
2
3
4
5
6
7
8
9
10
11
|
1 2 7 9 3 4 5 10 8
1 2 5 4 6 9 7 10 8
1 3 5 4 6 9 7 10 8
2 3 5 4 6 9 7 10 8
2 3 5 4 6 9 7 10 8
2 3 4 5 6 9 7 10 8
2 3 4 5 6 9 7 10 8
2 3 4 5 6 8 7 9 10
2 3 4 5 6 7 8 9 10
2 3 4 5 6 7 8 9 10
2 3 4 5 6 7 8 9 10
|
快速排序由 C. A. R. Hoare(东尼霍尔,Charles Antony Richard Hoare)在1960年提出,之后又有许多人做了进一步的优化。如果你对快速排序感兴趣可以去看看东尼霍尔1962年在Computer Journal发表的论文“Quicksort”以及《算法导论》的第七章。快速排序算法仅仅是东尼霍尔在计算机领域才能的第一次显露,后来他受到了老板的赏识和重用,公司希望他为新机器设计一个新的高级语言。你要知道当时还没有PASCAL或者C语言这些高级的东东。后来东尼霍尔参加了由Edsger Wybe Dijkstra(1972年图灵奖得主,这个大神我们后面还会遇到的到时候再细聊)举办的“ALGOL 60”培训班,他觉得自己与其没有把握去设计一个新的语言,还不如对现有的“ALGOL 60”进行改进,使之能在公司的新机器上使用。于是他便设计了“ALGOL 60”的一个子集版本。这个版本在执行效率和可靠性上都在当时“ALGOL 60”的各种版本中首屈一指,因此东尼霍尔受到了国际学术界的重视。后来他在“ALGOL X”的设计中还发明了大家熟知的“case”语句,后来也被各种高级语言广泛采用,比如PASCAL、C、Java语言等等。当然,东尼霍尔在计算机领域的贡献还有很多很多,他在1980年获得了图灵奖。
排序算法-快速排序(入门)相关推荐
- 排序算法 | 快速排序,算法的图解、实现、复杂度和稳定性分析与优化
今天讲解一下快速排序算法的原理以及实现.复杂度和稳定性分析与优化 目录 1 快速排序的原理 2 快速排序代码实现 3 复杂度和稳定性分析.优化 4 习题练习 1 快速排序的原理 快速排序是所有内部排序 ...
- 排序算法 快速排序 python 0913
排序算法 快速排序 python 0913 快速排序 思路 定义快排方法 接收参数:原始列表,起始位置,终止位置 判断是否符合快排条件,当起始下标与终止下标相等时,代表只有一个元素,无法排序,退出 一 ...
- 排序算法 快速排序【详细步骤图解】
排序算法 快速排序[详细步骤图解] 快速排序 主要思想 图解 第一轮分割序列 第二轮分割序列 --- 左子序列 小结 第三轮分割序列 --- 右子序列 C++实现 总结 快速排序 给定一个序列:22 ...
- 【图解算法】排序算法——快速排序
简介 首先还是得简单的介绍一下快速排序这个算法. 快速排序(Quicksort),又称划分交换排序(partition-exchange sort),一种排序算法,最早由东尼·霍尔提出.在平均状况下, ...
- JavaScript的排序算法——快速排序
排序算法(Sorting algorithm)是计算机科学最古老.最基本的课题之一.要想成为合格的程序员,就必须理解和掌握各种排序算法. 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排 ...
- 十大经典排序算法-快速排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- 排序算法---快速排序(java版)
快速排序 原理 快速排序(Quick Sort)算法,简称快排,利用的也是分治的思想,快排的思路是:如果要对 m->n 之间的数列进行排序,我们选择 m->n 之间的任意一个元素数据作为分 ...
- 实现快速排序的算法_排序算法-快速排序
快速排序是由东尼霍尔所发展的一种排序算法.在平均n个项目要Ο(nlogn) 次比较.在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见.事实上,快速排序通常明显比其他 Ο(nlogn) 算法更 ...
- 排序算法 —— 快速排序
快速排序算法介绍 划分问题:把数组的各个元素重排后分成左右两个部分,使得左边任意元素都小于或等于右边任意元素. 递归求解:把左右两部分分别排序. 快速排序代码 #include <iostrea ...
- 排序算法--快速排序
快速排序:快速排序(Quicksort)是对冒泡排序的一种改进.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部 ...
最新文章
- graylog2 架构--转载
- C++Primer:函数(参数传递:引用形参)
- Vue视频教程系列第三十七节-子路由地配置
- 用toad实现oracle数据迁移,Oracle 使用TOAD实现导入导出Excel数据
- 【Pytorch神经网络实战案例】21 基于Cora数据集实现Multi_Sample Dropout图卷积网络模型的论文分类
- 【youcans 的 OpenCV 例程 200 篇】112. 滤波反投影重建图像
- oracle创建登录用户有限制吗,Oracle创建用户限制文件,表空间用户授权等。
- eclipse添加maven配置
- Tomcat学习--源码导入和运行
- SpringCloud——负载均衡
- 53. Using a Custom Admin URL
- 小学英语与计算机技术整合,浅谈多媒体技术与小学英语教学的整合
- 使用canvas压缩图片
- 使用Mapper代理开发解决硬编码问题
- python的常用数组工具
- python中Could not find module “...atari_py\ale_interface\ale_c.dll‘ (or one of its dependence)
- python文本数据分析-新闻分类任务
- IDEA导出jar包后运行报错 找不到或无法加载主类
- python实现生日悖论分析
- 拼多多token延长时间