这个快速排序主要利用递归调用,数组存储方式。包含3个文件,头文件QuickSort.h,库函数QuickSort.c,测试文件TestQuickSort。

其中Cutoff可以自己给定,这个当开始给定的数组(或者递归调用产生的子数组)的元素个数<=20个时,采用插入排序。一般认为当元素个数<=20时,插入排序更快。这个20不是固定的,在这附近浮动都可以的。

头文件QuickSort.h

 1 #ifndef QuickSort_H
 2 #define QuickSort_H
 3 #define Cutoff 20
 4 typedef float ElementType;
 5 ElementType Median3(ElementType A[], int left, int right);
 6 void Swap(ElementType *p, ElementType*q);
 7 void InsertionSort(ElementType A[], int N);
 8 void QuickSort(ElementType A[], int N);
 9 void Qsort(ElementType A[], int Left, int Right);
10 void PrintMatrix(ElementType A[], int N);
11
12 #endif // !QuickSort_H

 

库函数QuickSort.c

 1 #include "QuickSort.h"
 2 #include<stdio.h>
 3 //通过三数中值分割法获得数组的枢纽元
 4 ElementType Median3(ElementType A[], int Left, int Right)
 5 {
 6     int Center = (Left + Right) / 2;
 7     if (A[Left] > A[Right])
 8         Swap(&A[Left], &A[Right]);
 9     if (A[Left] > A[Center])
10         Swap(&A[Left], &A[Center]);
11     if (A[Center] > A[Right])
12         Swap(&A[Center], &A[Right]);
13     //上述三次交换使得:A[Left]<A[Center]<A[Right]
14     Swap(&A[Center], &A[Right - 1]);
15     return A[Right - 1];//返回枢纽元;
16 }
17
18 //交换指针p和q各自指向的值;
19 void Swap(ElementType * p, ElementType * q)
20 {
21     ElementType Tmp;
22     Tmp = *p;
23     *p = *q;
24     *q = Tmp;
25 }
26
27 //当开始给定的数组(或者递归调用产生的子数组)的元素个数<=20个时,采用插入排序。
28 void InsertionSort(ElementType A[], int N)
29 {
30     int j, P;
31     ElementType Tmp;
32     for (P = 1; P < N; P++)
33     {
34         Tmp = A[P];
35         for (j = P; j > 0 && A[j - 1] > Tmp; j--)
36             A[j] = A[j - 1];
37         A[j] = Tmp;
38     }
39 }
40
41 //快速排序算法驱动程序
42 void QuickSort(ElementType A[], int N)
43 {
44     Qsort(A, 0, N - 1);
45 }
46
47 //快速排序核心算法
48 void Qsort(ElementType A[], int Left, int Right)
49 {
50     int i,j;
51     ElementType Pivot;
52     if (Left + Cutoff-1 <= Right)//此处Cutoff-1是为了和N-1=Right对应上
53     {
54         Pivot = Median3(A, Left, Right);//调用枢纽元函数选取枢纽元
55         i = Left; j = Right - 1;
56         for (; ;)
57         {
58             while (A[++i] < Pivot);
59             while (A[--j] > Pivot);
60             if (i < j) Swap(&A[i], &A[j]);
61             else break;
62         }
63         Swap(&A[i], &A[Right - 1]);
64         Qsort(A, Left, i - 1);//对剩下小于枢纽元的元素递归排序
65         Qsort(A, i + 1, Right);//对剩下大于枢纽元的元素递归排序
66     }
67     else//当最后子数组只有Cutoff个,则采用插入排序。
68         InsertionSort(A + Left, Right - Left + 1);
69 }
70
71 //打印数组
72 void PrintMatrix(ElementType A[], int N)
73 {
74     for (int i = 0; i < N; i++)
75         printf("%f ", A[i]);
76 }

测试文件TestQuickSort

 1 #include "QuickSort.h"
 2 #include <stdio.h>
 3 #include<time.h>
 4 #include<stdlib.h>
 5 #define N 100000
 6 int main()
 7 {
 8     ElementType A[N];
 9     srand((unsigned)time(NULL));
10     for (int i = 0; i < N; i++)
11         A[i] = (float)(rand() % N)/N;
12     //printf("原始数组:\n");
13     //PrintMatrix(A, N);
14     QuickSort(A, N);
15     printf("\n");
16     printf("排序后数组:\n");
17     PrintMatrix(A, N);
18     printf("\n");
19 }

随机生成100000个浮点型数据,调用QuickSort算法进行快速排序,速度极快。

转载于:https://www.cnblogs.com/xinlovedai/p/6229555.html

排序算法----快速排序(数组形式)相关推荐

  1. 排序算法 | 快速排序,算法的图解、实现、复杂度和稳定性分析与优化

    今天讲解一下快速排序算法的原理以及实现.复杂度和稳定性分析与优化 目录 1 快速排序的原理 2 快速排序代码实现 3 复杂度和稳定性分析.优化 4 习题练习 1 快速排序的原理 快速排序是所有内部排序 ...

  2. 排序算法 快速排序【详细步骤图解】

    排序算法 快速排序[详细步骤图解] 快速排序 主要思想 图解 第一轮分割序列 第二轮分割序列 --- 左子序列 小结 第三轮分割序列 --- 右子序列 C++实现 总结 快速排序 给定一个序列:22 ...

  3. 【图解算法】排序算法——快速排序

    简介 首先还是得简单的介绍一下快速排序这个算法. 快速排序(Quicksort),又称划分交换排序(partition-exchange sort),一种排序算法,最早由东尼·霍尔提出.在平均状况下, ...

  4. JavaScript的排序算法——快速排序

    排序算法(Sorting algorithm)是计算机科学最古老.最基本的课题之一.要想成为合格的程序员,就必须理解和掌握各种排序算法. 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排 ...

  5. 十大经典排序算法-快速排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  6. 排序算法 快速排序 python 0913

    排序算法 快速排序 python 0913 快速排序 思路 定义快排方法 接收参数:原始列表,起始位置,终止位置 判断是否符合快排条件,当起始下标与终止下标相等时,代表只有一个元素,无法排序,退出 一 ...

  7. 排序算法---快速排序(java版)

    快速排序 原理 快速排序(Quick Sort)算法,简称快排,利用的也是分治的思想,快排的思路是:如果要对 m->n 之间的数列进行排序,我们选择 m->n 之间的任意一个元素数据作为分 ...

  8. 排序算法 —— 快速排序

    快速排序算法介绍 划分问题:把数组的各个元素重排后分成左右两个部分,使得左边任意元素都小于或等于右边任意元素. 递归求解:把左右两部分分别排序. 快速排序代码 #include <iostrea ...

  9. 排序算法--快速排序

    快速排序:快速排序(Quicksort)是对冒泡排序的一种改进.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部 ...

  10. Java排序算快速排序_Java排序算法 [快速排序]

    package cn.com.dom4j.sort; public class QuickSort { /** 快速排序 在 Java中, 快速排序被用作基本数据类型的排序 (当然, 不只快速排序一种 ...

最新文章

  1. django-admin 设计User外键,设计model
  2. python获取ftp所有文件名_在Python中获取最新的FTP文件夹名称
  3. 1-5Tomcat 目录结构 和 web项目目录结构
  4. STM32F7xx —— CAN通信
  5. skywalking(1) 基于opentracing规范的APM系统
  6. mysqldump备份报Binlogging on server not active的解决
  7. strtoupper 小写_PHP strtoupper()函数与示例
  8. 使用Entity Framework Core,Swagger和Postman创建ASP.NET Core Web API的分步指南
  9. 铵钮提交事件PostBack之后,一些动态加载的物件丢失
  10. 红番茄(VS2017)两个注意点
  11. CentOS 6.3安装MPlayer
  12. c++实现课程管理系统
  13. Mysql创建锁芯_A级锁规格释疑
  14. C语言中的半角字符,java全角、半角字符的关系以及转换详解
  15. Qt其实时报:一下插件错误无法被载入
  16. 微信小程序图片预览禁止保存
  17. 脉冲宽度调制PWM的原理及应用
  18. PMBOK2004版44个过程的工具和技术的总结
  19. 清华周界详解《基于图神经网络的事实验证》 | 百万人学AI
  20. 信号与系统之信号的时域分析

热门文章

  1. Android中ListView与RadioButton结合----自定义单选列表
  2. 动态规划算法的优化技巧
  3. mysql带AND关键字的多条件查询
  4. golang中的strings.Join
  5. 扇区、磁盘块、页、页框、缓冲区之间的关系!
  6. 2.STM32中对Key_GPIO_Config()函数的理解(自定义)之轮询控制按键LED
  7. python三十一:random模块
  8. Reflection
  9. 2017.3.9 对象 函数
  10. linux安装和配置 mysql、redis 过程中遇到的问题记录(转)