c语言 快排排序
快速排序(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 *, ...
 
随机推荐
- 介绍一下linux的文件系统
			
(1)/bin:该目录用于存放用户命令. 目录 /usr/bin 中也存放了一些用户命令.(2)/sbin:该目录用于存放许多系统命令,例如 shutdown.目录 /usr/bin 中也包括了许多系 ...
 - Oracle RAC中的一台机器重启以后无法接入集群
			
前天有个同事说有套AIX RAC的其中一台服务器重启了操作系统以后,集群资源CSSD的资源一直都在START的状态,检查日志输出有如下内容: [ CSSD][1286]clssnmv ...
 - 安装gcc及开发环境
			
安装gcc及开发环境================================> 安装gcc: * apt-get install build-essential * gcc ...
 - hadoop相关问题
			
发现一篇不错的文章,转一下.http://www.cnblogs.com/xuekyo/p/3386610.html HDFS导论(转) 1.流式数据访问 HDFS的构建思想是这样的:一次写入,多 ...
 - always语言指导原则
			
1.每个always只有一个@(event-expression). 2.always块可以表示时序逻辑和组合逻辑. 3.带有posedge和negedge关键字的是表示沿触发的时序逻辑,没有的表示组 ...
 - Payment Terms    收付款条件和分期付款设置
			
SAP Payment Terms 中文翻译为收付款条件,他的用途是应收和应付的财务凭证中账期的管理,顾名思义即手动录入和自动生成的财务文档多少天内冲销处理则为正常,否则为超期应收应付文档,它包含的内 ...
 - LintCode-Compare Strings
			
Compare two strings A and B, determine whether A contains all of the characters in B. The characters ...
 - 图片轮播插件-carouFredSel
			
carouFredSel图片轮播插件基于Jquery,比较常规的轮播插件,支持滚轮及键盘左右按键,加入其它插件可实现更加复杂的特效. 主页地址:http://caroufredsel.dev7stud ...
 - Careercup - Facebook面试题 - 5765850736885760
			
2014-05-02 10:07 题目链接 原题: Mapping ' = 'A','B','C' ' = 'D','E','F' ... ' = input: output :ouput = [AA ...
 - WPF多语言化的实现
			
Metro插件系统系列就暂时停一下,这次我们讨论一下WPF的资源本地化实现,主要用到的:CultureInfo,ResourceManger,MarkupExtension,RESX文件,这些都是.N ...