快速排序(Quick Sort):
这个算法的霸气程度从它的名字就可以看出来了。快速排序的应用也是非常广的的,各种类库都可以看到他的身影。这当然与它的“快”是有联系的,正所谓天下武功唯快不破。
快速排序的一个特点是,对数组的一次遍历,可以找到一个枢纽元(pivot)确定位置,还可以把这个数组以这个枢纽元分成两个部分,左边的元素值都比枢纽元小,右边的都比枢纽元大。我们递归地解决这两个子数组即可。
我们还是通过一个特殊的例子来看一下快速排序的原理:
我们假设有这样一个数组{ 4,7,3,2,8,1,5 }
对于快速排序来说,第一步就是找出一个枢纽元,而对于枢纽元的寻找是对整个算法的时间性能影响很大的,因为搞不好快速排序会退化成选择排序那样。
对于这个不具有代表性的例子,我们选择的是第一个元素做为枢纽元。
pivot 4
{ 4,7,3,2,8,1,5 }
其中,红色为左指针,蓝色为右指针。一开始我们从右边开始,找到第一个比pivot小的数。停止,然后将该值赋给左指针,同样,左指针向右移动。
也就是说我们第一次得到的的结果是这样的:
{ 1,7,3,2,8,1,5 }
同样的道理,我们在左边找到一个比pivot大的值,赋值给右指针,同时右指针左移一步。
得到的结果应该是这样的:
{ 1,7,3,2,8,7,5 }
请注意,我们的这个移动过程的前提都是左指针不能超过右指针的前提下进行的。
这两个过程交替进行,其实就是在对元素进行筛选。这一次得到的结果是:
{ 1,2,3,2,8,7,5 }
黄色高亮表示两个指针重叠了,这时候我们也就找到了枢纽元的位置了,将我们的枢纽元的值插入。
也就是说,我们接下来的工作就是以这个枢纽元为分割,对左右两个数组进行同样的排序工作。
来看看具体的代码是怎么实现的:
#include <stdio.h> // 快速排序的主要部分
// 函数完成 data[左区间] < data[mid] < data[右区间]
// 同时返回枢轴 left
int sort(int *data, int left, int right)
{
int key; key = data[left]; // 选择 left 做枢轴
while (left < right)
{
// 因为枢轴选在 left, 所以先从右边开始
while (left < right && data[right] >= key) right--;
data[left] = data[right]; // 此时 data[right] 是空闲的
while (left < right && data[left] <= key) left++;
data[right] = data[left]; // 此时 data[left] 是空闲的
}
// 此时 left == right, 所以下句代码的 data[left] 和 data[right] 是一样的
data[left] = key;
return left; // 同理, 返回 right 也可
} // 快速排序, 排序区间 [left..right]
// 区间分割, [left..mid-1] [mid] [mid + 1..right]
void quick_sort(int *data, int left, int right)
{
int mid; // 枢轴
if (left < right)
{
mid = sort(data, left, right);
quick_sort(data, left, mid - 1);
quick_sort(data, mid + 1, right);
}
} int main(void)
{
int i, n;
int data[100]; printf("请输入 n, 及 n 个元素: ");
scanf("%d", &n);
for (i=0; i<n; i++) scanf("%d", data + i); quick_sort(data, 0, n-1);
printf("排序后: ");
for (i=0; i<n; i++) printf("%d, ", data[i]);
printf("\n\n");
return 0;
}
c语言 快排排序的更多相关文章
-
C语言快排
C语言使用快排的方式有两种,1.直接用库函数stdlib.h里的qsort函数 2.自己编写快排代码(第一种方便,第二种较为*) qsort 的函数原型是:void qsort(void*base, ...
-
Java 快排 排序
一.快排的一种 ==================== public class myMain { public static void main(String[] args) { int t[] ...
-
Quick Sort(快排)
这是挖坑填补法的演示 快排之挖坑填补法: void Quick(int top/*起始位置*/,int end/*末尾位置*/,int arr[])//挖坑填补法 { int i=top,j=end, ...
-
【C语言编程入门笔记】排序算法之快速排序,一文轻松掌握快排!
排序算法一直是c语言重点,各个算法适应不用的环境,同时,在面试时,排序算法也是经常被问到的.今天我们介绍下快速排序,简称就是快排. 1.快速排序思想: 快排使用 分治法 (Divide and con ...
-
C语言实现单向链表及其各种排序(含快排,选择,插入,冒泡)
#include<stdio.h> #include<malloc.h> #define LEN sizeof(struct Student) struct Student / ...
-
C++学习(三十八)(C语言部分)之 排序(冒泡 选择 插入 快排)
算法是解决一类问题的方法排序算法 根据元素大小关系排序 从小到大 从大到小冒泡 选择 插入 快排希尔排序 归并排序 堆排序 冒泡排序 从头到尾比较 每一轮将最大的数沉底 或者最小数字上浮 选择排序 1 ...
-
c语言中使用自带的qsort(结构体排序)+ 快排
c中没有自带的sort函数emm 不过有自带的qsort函数 (其实用法都差不多(只是我经常以为c中有sort 头文件要用 #include <stdlib.h> 一定要重新把指针指向的值 ...
-
排序算法C语言实现——冒泡、快排、堆排对比
对冒泡.快排.堆排这3个算法做了验证,结果分析如下: 一.结果分析 时间消耗:快排 < 堆排 < 冒泡. 空间消耗:冒泡O(1) = 堆排O(1) < 快排O(logn)~O(n) ...
-
qsort 快排函数(C语言)
qsort 快排函数(C语言) 函数原型 void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, ...
随机推荐
-
hdu 2602
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 #include<cstdio> #include<iostream> ...
-
CCF真题之日期计算
201509-2 日期计算 问题描述 给定一个年份y和一个整数d,问这一年的第d天是几月几日? 注意闰年的2月有29天.满足下面条件之一的是闰年: 1) 年份是4的整数倍,而且不是100的整数倍: 2 ...
-
InLineHookSSDT
//当Ring3调用OpenProcess //1从自己的模块(.exe)的导入表中取值 //2Ntdll.dll模块的导出表中执行ZwOpenProcess(取索引 进入Ring0层) //3进入R ...
-
Collection+JSON 文档
Collection+JSON 文档 对于这个设计,我们不再以可能的状态和转移为起点,相反,我们将从一个集合状态响应中可能元素的顶层布局开始.从这一点入手,其他细节可以随着设计向超媒体类型最底层属性的 ...
-
利用 Gitbook 生成文档中心站点
经过一个多月,Bugtags 最近上线了自己的文档站点:docs.bugtags.com,在这里你可以找到 Bugtags 集成.使用相关的绝大部分问题. 在这之前我们使用的是第三方提供的帮助中心产品 ...
-
详解Android定位
相信很多的朋友都有在APP中实现定位的需求,今天我就再次超炒冷饭,为大家献上国内开发者常用到的三种定位方式.它们分别为GPS,百度和高德,惯例先简单介绍下定位的背景知识. 什么是GPS定位.基站定位和 ...
-
HDU4349--Xiao Ming&#39;s Hope(数论)
输入一个n(1<=n<=108),求C(n,0),C(n,1),C(n,2)...C(n,n)有多少个奇数. Lacus定理 http://blog.csdn.net/acm_cxlove ...
-
web api 开发之 filter
1.使用filter之前应该知道的(不知道也无所谓,哈哈!) 谈到filter 不得不先了解下aop(Aspect Oriented Programming)面向切面的编程.(度娘上关于aop一大堆 ...
-
解决genymotion-arm-translation.zip无法拖拽安装的问题
1.问题由来 适用情况一:当我们启动了Genymotion模拟器后,在AndroidStudio运行app时,弹出如下错误: INSTALL_FAILED_CPU_ABI_INCOMPATIABLE ...
-
对mysql数据库字符串类型的数字排序
select * from user where 1=1 order by salary*1 desc limit 0,5 or select * from user where 1=1 ord ...