快速排序的C语言实现
快速排序方法对整数序列操作的一种C语言实现
目标
给定一个长度为n的整数序列,将序列从小到大进行排序
原理
- 从序列中任选一个值,将原有序列划分为两个子序列,其中,左侧序列中的值均小于该选出的值,右侧序列中的值均大于或者等于该选中的值,该值位于两个子序列交界(既不属于左侧、也不属于右侧);
- 分别对左侧、右侧的子序列用同样的方法进行排序;
- 将两个子序列以及中心位置的值进行合并,获得最终排序后的结果。
实现
#include <stdio.h>/*** 将输入序列划分为两个子序列,并返回中间位置的下标* * @param arr 输入划分的输入序列* @param left 需要划分序列的最左侧元素下标* @param right 需要划分序列的最右侧位置下标* @return 找到的中心位置坐标*/
int partition(int arr[], int left, int right) {int j = left, i;int selectedValue = arr[right];int temp;// 用j指定预期的中心点位置// 用游标i从左向右遍历,如果小于选定值,则扔到j指定位置的左侧,否则继续向右for (i = left; i < right; i++) {if (arr[i] < selectedValue) {// 交换i与j位置的值,并更新j指向的位置temp = arr[i];arr[i] = arr[j];arr[j] = temp;j++;}}arr[right] = arr[j];arr[j] = selectedValue;return j;
}/*** 对输入序列进行快速排序** @param arr 待排序数组* @param left 需要排列位置的最左侧元素下标* @param right 需要排序位置的最右侧位置下标*/
void quickSort(int arr[], int left, int right) {int q;if (left < right) {q = partition(arr, left, right);quickSort(arr, left, q - 1);quickSort(arr, q + 1, right);}
}int main() {int i = 0;int a[15] = { 3, 4, 53, 4, 5, 3, 4, 5, 6, 2, 37, -3,-33, 5, 3 };quickSort(a, 0, 14);// 输出for (i = 0; i < 15; i++) {printf("%d ", a[i]);}return 0;
}
运行结果
-33 -3 2 3 3 3 4 4 4 5 5 5 6 37 53
分析
- 因为代码中直接在序列原有位置进行排序,所以,可以直接省掉原理第3条中的合并步骤;
- 在进行划分时,可以有很多方法找到中间位置,例如从两侧往中间找,分别找到一个大于选定值和一个小于选定值的,进行交换。在本实现中,则从一侧开始找,并用两个下标进行辅助标志预期的中心位置。
- 在快速排序方法中,在理想情况下,应该每次都能成功把序列划分成两个长度相等的子序列,此时,其时间复杂度为
O(nlogn)
,而在极端情况下,则每次划分都找到了端点位置,此时,快速排序的时间复杂度将降为O(n^2)
快速排序的C语言实现相关推荐
- 快速排序及C语言实现
排序系列之(3)快速排序及C语言实现 收藏 快速排序(Quicksort)是对冒泡排序的一种改进.由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的 ...
- 快速排序算法C语言实现
快速排序算法C语言实现 在任何程序中,数组的排序都是极为重要的内容,我们需要按照业务需要对大量的数据进行排序,因此排序的速度或者说效率就显得极为重要了,因此选择一个效率较高的算法可以大大提升程序的性能 ...
- 快速排序实验报告 c语言,快速排序算法c语言实验报告.docx
快速排序算法c语言实验报告 实验六:冒泡法排序 物理学416班赵增月F12XX日期:XX年10月31日 一·实验目的1.熟练掌握程序编写步骤: 2.学习使用冒泡法和选择法排序: 3.熟练掌握数组的定义 ...
- 随机快速排序算法(C语言)
随机快速排序(C语言) 分治法基本思想 将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同.递归的解决这些子问题,然后将各个子问题的解合并得到原问题的解. 快速排序 原链 ...
- c语言快速排序案例,什么是快速排序?C语言数组快速排序例子
快速排序(Quick Sort)是一种有效的排序算法.虽然算法在最坏的情况下运行时间为O(n^2),但由于平均运行时间为O(nlogn),并且在内存使用.程序实现复杂性上表现优秀,尤其是对快速排序算法 ...
- 快速排序c语言实现,快速排序的C语言代码实现
快速排序实质上是对"冒泡排序"的一种改进,整个排序过程可概括为:通过N趟的排序将原本的排序数据分为若干块进行分块排序,而在每趟排序过程中,以指定的关键字将待排数据分别分为比关键字大 ...
- 快速排序算法 c语言实现
快速排序是一种分治算法,它将一个数组分成两个子数组,将两个子数组分别排序,最终使得整个数组有序. 下面是一个 C 语言实现的快速排序算法: void quick_sort(int *arr, int ...
- 快速排序【C语言数据结构】
目录 一.快速排序的基础实现 1.经典写法 2.挖坑法 3.前后指针法 二.快速排序第二部分的写法 三.优化我们基准值的选取 四.快速排序的非递归写法 五.代码的汇总 六.测试代码 快速排序,顾名思义 ...
- 算法学习之快速排序的C语言实现
近几天在学习简单算法,今天看了一个快速排序和堆排序,堆排序还没搞懂,还是先把快速排序搞清楚吧 教程网上一艘一大堆,这里选择一个讲的比较通俗的的一个吧: http://blog.csdn.net/mor ...
- 算法—快速排序Sqrt (C语言)
/* 快速排序 */ #include"stdio.h" #include"stdlib.h" int compare(const void* a,const ...
最新文章
- JqGridView 1.0.0.0发布
- OpenGL ES3 0实现简单粒子火焰效果
- 以get方式传递json字符串问题。
- [原创]java WEB学习笔记02:javaWeb开发的目录结构
- OEL7.2下Oracle11.2.0.4RAC部署
- 《gcc五分钟系列》第六节:编译期符号检查
- 采购的业务处理流程之 现购
- java在虚拟机下的安装_centos 虚拟机下安装 Java方法
- 如何监视Java EE数据源
- 库克发文纪念苹果成立45周年:伟大使命还有待实现
- Python合并多幅静图为GIF动图
- 整理了一些面试题,还在更新中,有时间的可以看看
- 今天入手了二手X61
- DevOps使用教程 华为云(6)文档报告 项目进度 会议记录 迭代评审
- 电子科学与技术毕业论文题目【452个】
- 常微分方程的近似计算和误差估计(2)
- 昨日美股:美联储不再降息,苹果再创历史新高
- python中三角函数运算符_Python入门之三角函数sin()函数实例详解
- 链家爬虫python_python爬虫-链家租房信息获取
- 测试学习--云测试平台
热门文章
- BUUCTF:sqltest
- Dennis M. Ritchie(丹尼斯里奇)
- selenium模拟登录QQ空间
- 关于Solidworks启动和office的VBA干涉解决方法
- dlna android电视,DLNA推送安卓手机投屏电视
- 《SAFe 4.0参考指南:精益软件与系统工程的规模化敏捷框架》SAFe基础
- sendmail 邮件服务器 套件,SENDMAIL邮件服务器的安装与设置
- 隐藏“WPS Office云文档”在我的电脑中显示的快捷入口
- dqw3721:自己动手写打印机监控程序
- [ASP调试]小旋风Web服务器使用