排序算法----快速排序(数组形式)
这个快速排序主要利用递归调用,数组存储方式。包含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 快速排序的原理 2 快速排序代码实现 3 复杂度和稳定性分析.优化 4 习题练习 1 快速排序的原理 快速排序是所有内部排序 ...
- 排序算法 快速排序【详细步骤图解】
排序算法 快速排序[详细步骤图解] 快速排序 主要思想 图解 第一轮分割序列 第二轮分割序列 --- 左子序列 小结 第三轮分割序列 --- 右子序列 C++实现 总结 快速排序 给定一个序列:22 ...
- 【图解算法】排序算法——快速排序
简介 首先还是得简单的介绍一下快速排序这个算法. 快速排序(Quicksort),又称划分交换排序(partition-exchange sort),一种排序算法,最早由东尼·霍尔提出.在平均状况下, ...
- JavaScript的排序算法——快速排序
排序算法(Sorting algorithm)是计算机科学最古老.最基本的课题之一.要想成为合格的程序员,就必须理解和掌握各种排序算法. 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排 ...
- 十大经典排序算法-快速排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- 排序算法 快速排序 python 0913
排序算法 快速排序 python 0913 快速排序 思路 定义快排方法 接收参数:原始列表,起始位置,终止位置 判断是否符合快排条件,当起始下标与终止下标相等时,代表只有一个元素,无法排序,退出 一 ...
- 排序算法---快速排序(java版)
快速排序 原理 快速排序(Quick Sort)算法,简称快排,利用的也是分治的思想,快排的思路是:如果要对 m->n 之间的数列进行排序,我们选择 m->n 之间的任意一个元素数据作为分 ...
- 排序算法 —— 快速排序
快速排序算法介绍 划分问题:把数组的各个元素重排后分成左右两个部分,使得左边任意元素都小于或等于右边任意元素. 递归求解:把左右两部分分别排序. 快速排序代码 #include <iostrea ...
- 排序算法--快速排序
快速排序:快速排序(Quicksort)是对冒泡排序的一种改进.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部 ...
- Java排序算快速排序_Java排序算法 [快速排序]
package cn.com.dom4j.sort; public class QuickSort { /** 快速排序 在 Java中, 快速排序被用作基本数据类型的排序 (当然, 不只快速排序一种 ...
最新文章
- java map collection_java 集合----Map、Collection
- 真正毁掉一个人的,是“打工者心态”
- Matlab中fft作频谱横纵坐标
- JavaScript快速入门(六)——DOM
- Python列表排序 reverse、sort、sorted 操作方法详解
- 在保存Bitmap的时候出现“GDI出现一般性错误”
- 【quickhybrid】API的分类:短期API、长期API
- 解决pycharm中新建的工程因为运行图标等均为灰色而无法运行的问题
- Centos系统python2.x升级python3.x
- 源码阅读:SDWebImage(五)——SDWebImageFrame
- 操作系统—死锁的避免
- vim字符串全局替换
- css vue 内联_vue ssr css内联样式和link标签重复
- 短视频从业者实操资料大全(含代运营案例+报价单+合同协议 +分镜头脚本+管理运营)共180份
- 百度笔试题——开发测试工程师(深圳)
- 软件测试常见的开发模型
- AndroidStudio如何删除Modle
- 实现类似PS魔棒功能(漫水填充floodfill()) OpenCV
- 六度人脉 全球最高效的人脉法则(图)
- OSChina 周二乱弹 —— 假期余额已不足!