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 非缓冲io笔记
简介 在linux中,打开的的文件(可输入输出)标识就是一个int值,如下面的三个标准输入输出 STDIN_FILENO/STDOUT_FILENO/STDERR_FILENO这三个是标准输入输出,对 ...
- android连接本地tomcat服务器,报timeout
1.在eclipse环境下连接时,没有任何问题 2.直接将服务端发布到tomcat服务下,报timeout 3.查明原因: 3.1打开IE访问,一切正常,可以获取到数据,说明不是服务端的问题 3.2打 ...
- cocos2dx中创建动画的三种方法
1.最最原始的方法,先创建动画帧,再创建动画打包(animation),再创建动画(animate) 第一步: 创建动画帧:CCSpriteFrame,依赖于原始的资源图片(xx.png,xx.jpg ...
- clion windows 开发配置
1.下载clion 并且安装. 地址 : http://download-cf.jetbrains.com/cpp/clion-1.0.1.exe 2.安装cygwin 地址: https://cy ...
- nodejs小问题:express不是内部或外部命令(转载)
安装express之后发现居然提示express不是内部或外部命令. 工具/原料 Node.js安装包 方法/步骤 1 首先下载Node.js安装包,此处我用的是官方最新的v0.10.27 32位版: ...
- android 播放语音文件出现 prepare failed ,不能下载amr文件
amr文件的路径正确,但是android 却不能播放出来. 调试发现时根本就没有下载下来 原因: IIS服务器不允许下载该文件,需要配置MIME 解决方法: 进入IIS目录,配置MIME
- 关于sublime text的配置方法
一个星期没有写博客了, 是时候来一波了 -------------------------------------------------------------------------------- ...
- IntelliJ IDEA 15 显示工具栏及底部周边工具栏
- text-align:-moz-center与text-align:-webkit-center区别与用法
最近发现各浏览器的不兼容,关于text-align:center这个很多浏览器不兼容. 1.测试发现:text-align:center在IE下是管用的. 2.text-align:-moz-cent ...
- 【HDOJ】【4089】Activation
概率DP kuangbin总结中的第5题 题解copy: HDU 4098 题意:有n个人排队等着在官网上激活游戏.Tomato排在第m个. 对于队列中的第一个人.有一下情况: 1.激活失败,留在队列 ...