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

  1. C语言快排

    C语言使用快排的方式有两种,1.直接用库函数stdlib.h里的qsort函数 2.自己编写快排代码(第一种方便,第二种较为自由) qsort 的函数原型是:void qsort(void*base, ...

  2. Java 快排 排序

    一.快排的一种 ==================== public class myMain { public static void main(String[] args) { int t[] ...

  3. Quick Sort(快排)

    这是挖坑填补法的演示 快排之挖坑填补法: void Quick(int top/*起始位置*/,int end/*末尾位置*/,int arr[])//挖坑填补法 { int i=top,j=end, ...

  4. 【C语言编程入门笔记】排序算法之快速排序,一文轻松掌握快排!

    排序算法一直是c语言重点,各个算法适应不用的环境,同时,在面试时,排序算法也是经常被问到的.今天我们介绍下快速排序,简称就是快排. 1.快速排序思想: 快排使用 分治法 (Divide and con ...

  5. C语言实现单向链表及其各种排序(含快排,选择,插入,冒泡)

    #include<stdio.h> #include<malloc.h> #define LEN sizeof(struct Student) struct Student / ...

  6. C++学习(三十八)(C语言部分)之 排序(冒泡 选择 插入 快排)

    算法是解决一类问题的方法排序算法 根据元素大小关系排序 从小到大 从大到小冒泡 选择 插入 快排希尔排序 归并排序 堆排序 冒泡排序 从头到尾比较 每一轮将最大的数沉底 或者最小数字上浮 选择排序 1 ...

  7. c语言中使用自带的qsort(结构体排序)+ 快排

    c中没有自带的sort函数emm 不过有自带的qsort函数 (其实用法都差不多(只是我经常以为c中有sort 头文件要用 #include <stdlib.h> 一定要重新把指针指向的值 ...

  8. 排序算法C语言实现——冒泡、快排、堆排对比

    对冒泡.快排.堆排这3个算法做了验证,结果分析如下: 一.结果分析 时间消耗:快排 < 堆排 < 冒泡. 空间消耗:冒泡O(1) = 堆排O(1) < 快排O(logn)~O(n) ...

  9. qsort 快排函数(C语言)

    qsort 快排函数(C语言) 函数原型 void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, ...

随机推荐

  1. Python标准库 urllib2 的使用

    1.Proxy 的设置 urllib2 默认会使用环境变量 http_proxy 来设置 HTTP Proxy. 如果想在程序中明确控制 Proxy,而不受环境变量的影响,可以使用下面的方式 impo ...

  2. mapreduce 实现pagerank

    输入格式: A 1 B,C,D B 1 C,Dmap: B A 1/3 C A 1/3 D A 1/3 A |B,C,D C B 1/2 D B 1/2 B |C,Dreduce: B (1-0.85 ...

  3. Object.keys()

    Object.keys(obj),返回一个数组,数组里是该obj可被枚举的所有属性名.请看示例: 示例一: function Pasta(grain, width, shape) { this.gra ...

  4. 为什么我们使用192.168.0.1作为内网ip

    私有IP地址是一段保留的IP地址.只是使用在局域网中,在Internet上是不使用的. 私有IP地址的范围有: 10.0.0.0-10.255.255.255 172.16.0.0—172.31.25 ...

  5. 幻灯片slider

    <script src="{$GetInstallDir}web/scripts/jquery-1.3.1.js"></script> <style& ...

  6. .net datatable 添加一列

    dt.Columns.Add("image", Type.GetType("System.String")); foreach (DataRow dr in d ...

  7. 视频FMS服务器带宽成本分析

    一.现状 调查了一下,主要有两种主流方式,WebRTC或者Flash. 1. WebRTC(不支持IE浏览器,已排除):网页实时通信(英语:Web Real-Time Communication)的缩 ...

  8. Linux "ls -l"文件列表权限详解

    ls Linux "ls -l"文件列表权限详解 1.使用 ls -l 命令 执行结果如下(/var/log) : drwxr-x--- root adm -- : apache2 ...

  9. angular入门系列教程1

    主题: 一个能够跑起来的页面,神奇的效果,无需一样JS代码! 效果图: 细节: 当然,这里甚至连登陆都没做,只是看到神奇的当输入用户名或者密码的时候,下面的预览区域也会有相应的更改.没有一行的JS代码 ...

  10. Leetcode#80 Remove Duplicates from Sorted Array II

    原题地址 简单模拟题. 从先向后遍历,如果重复出现2次以上,就不移动,否则移动到前面去 代码: int removeDuplicates(int A[], int n) { ) return n; ; ...