快速排序,C语言实现
排序法里比较出名的,具体的算法看下图:

这篇博客说的通俗易懂:http://blog.csdn.net/morewindows/article/details/6684558
这是快速排序的基础,用代码实现如下:
void DiviedSort(int* arr_p,int start,int end)
{
int left,right,i=;
int pivot,result;
bool flag;
flag = TRUE;
pivot = arr_p[start];
right = end;
left = start;
#if DEBUG
printf("pivot:%d\r\n",pivot);
printf("L: ");
for(i=;i<end+;i++){
if(i==)
printf("_ ");
else
printf("%d ",arr_p[i]);
}
printf("\r\n");
#endif
while(left<right && flag){
while(arr_p[right]>=pivot){
right--;
if(right<=left){ //右边没有找到小于pivot的数 退出总循环
arr_p[left] = pivot; //将pivot保存到左边的坑里
flag = FALSE;
break;
}
}
if(flag){
//找到小于pivot的数移动到left
arr_p[left] = arr_p[right];
arr_p[right] = ;
left++;
if(left>=right){
flag = FALSE;
arr_p[right] = pivot;//当left右移等于right说明正好结束;
}
}else{
#if DEBUG
printf("Lf: ");
for(i=;i<end+;i++){
if(arr_p[i]==)
printf("_ ");
else
printf("%d ",arr_p[i]);
}
printf("\r\n");
#endif
break;
}
#if DEBUG
printf("R: ");
for(i=;i<end+;i++){
if(arr_p[i]==)
printf("_ ");
else
printf("%d ",arr_p[i]);
}
printf("\r\n");
#endif
while(arr_p[left]<=pivot){
left++;
if(left>=right){//左边没有找到大于pivot的数退出总循环
arr_p[right] = pivot;//保存pivot到右边的坑里
flag = FALSE;
break;
}
}
if(flag){
//找到大于pivot的数移动到right
arr_p[right] = arr_p[left];
arr_p[left] = ;
right--;
if(right<=left){
flag = FALSE;
arr_p[left] = pivot;//当right左移等于left说明正好结束
}
}else{
#if DEBUG
printf("Rf: ");
for(i=;i<end+;i++){
if(arr_p[i]==)
printf("_ ");
else
printf("%d ",arr_p[i]);
}
printf("\r\n");
#endif
break;
}
#if DEBUG
printf("L: ");
for(i=;i<end+;i++){
if(arr_p[i]==)
printf("_ ");
else
printf("%d ",arr_p[i]);
}
printf("\r\n");
#endif
}
}
运行结果是:

这个例子比较特殊。一轮就得出结果了,但是实际上要对pivot左右两边都分别递归调用这个算法,才能得到从小到大的顺序。
这里递归判断的条件是:
Left<Right
左边下标大于或者等于右边下标的时候说明数字已经按照从小到大排列。
下面是快速排序的完整代码。
//快速排序
//left:数组的起始位
//right:数组的结束位置,注意不是数组的最大容量
void QuickSort(int * arr,int left,int right)
{
int pivotNum = ;
int start,end;
if(left<right){
start = left,end = right;
pivotNum = arr[start];
while(start<end){
//从右边找一个小于pivotNum的数
while(start<end && arr[end]>=pivotNum){
end--;//右边的游标左移
}
if(start<end){
arr[start++] = arr[end];
}
//从左边找一个大于pivotNum的数
while(start<end && arr[start]<=pivotNum){
start++;//左边的游标右移
}
if(start<end){
arr[end--] = arr[start];
}
}
arr[start] = pivotNum;//这里在得出按照pivotNum比较得出顺序之后,要把中间数保存到最后游标停下的位置
QuickSort(arr,left,start-);
QuickSort(arr,start+,right);
}
}
验证代码:
int main(int argc, char *argv[]) {
int i=;
int arr[] = {,,,,,,,,,,};
QuickSort(arr,,);
for(i=;i<;i++){
printf("%d ",arr[i]);
}
printf("\r\n");
system("pause");
return ;
}
运行结果:

最后对于pivotNum中间值的选择可以随机选择也可以去中间值。
快速排序的效率问题:
如果每次确定的中值都是最小或者最大,那么时间复杂度是O(N^2);
最好的情况是中值正好是中间值,那么时间复杂度是O(nlgN);
总结:就平均效率而言,快速排序是基于关键之比较的速度最快的,平均效率是O(nlgN);
快速排序,C语言实现的更多相关文章
- 快速排序_C语言_数组
快速排序_C语言_数组 #include <stdio.h> void quickSort(int *, int, int); int searchPos(int *, int, int) ...
- 快速排序 - C语言
看了这本<数据结构与算法分析>中的快速排序. 写下自己理解后的代码,以备后用. #include "stdio.h" void insertSort(int arr[] ...
- [数据结构] 快速排序C语言程序
//由大到小//快速排序(待排序数组,左侧起点,右侧起点) void quickSort(int *array, int l, int r) { if ( l >= r) return; int ...
- 快速排序 C语言实现
转载于> http://blog.chinaunix.net/uid-26404477-id-3329885.html 总的关键字比较次数:O(nlgn) 尽管快速排序的最坏时间为O(n2),但 ...
- 快速排序c语言实现
#include <stdio.h> void quick_sort(int* a, int n) { ) return; int i,j,tmp,k; k = a[n/]; ,j = n ...
- P1177【模板】快速排序(JAVA语言)
import java.util.Scanner; import java.util.ArrayList; import java.util.Collections; import java.util ...
- 快速排序C语言版图文详解
算法原理:选一个数位基准,将序列分成两个部分,一边全是比它小序列,另一边全是比它大序列.然后再分别对比他小的序列和比再次进行基准分割.依次分割下去,得到一个有序的队列. 原理图示: 编辑 编辑 ...
- C语言排序
排序算法 快速排序 C语言快速排序qsort(数组,长度,元素大小,cmp函数(*,*))//注意函数cmp的参数为指针 #include <stdio.h> #include <s ...
- PHP-----数组和常见排序算法
数组的创建 <?php //php创建数组 //第一种方法 $arr[0]=1; $arr[1]=23; $arr[2]=20; $arr[3]=43; for($i=0;$i<count ...
- Neo4j 3.5发布,在索引方面大幅增强
Neo4j 3.5版本已正式发布,这也是Neo4j宣布企业版闭源以来发布的第一个版本. 这个版本在性能.资源使用率以及安全方面均有增强,我们可以先快速浏览一下这个版本: 全文索引 基于Index的快速 ...
随机推荐
- Python开发【第六章】:Python面向对象
编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程,一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式有很多种 ...
- vertical-align属性
准备阶段 vertical-align取值及含义: 值 含义 baseline 默认.元素放置在父元素的基线上. top 把元素的顶端与行中最高元素的顶端对齐 text-top 把元素的顶端与父元素字 ...
- JQuery执行DOM批量克隆并插入的提效方法
JQuery clone方法可以实现对指定DOM对象的快速复制,并插入文档中. 对于同一类型的对象往往需要按照同一样式模板(HTML标签代码)复制N份并插入文档中,然后再将内容填入模板中,这就需要批量 ...
- 开发环境中biztalk项目设置注意事项(转)
适用版本:biztalk 2006 适用环境:开发测试环境 在开发过程中,在开发环境中,一定会是一个对项目不断的修改.编译.部署.测试,查看测试结果,发现有问题,然后回到开发环境再修改.编译.部署 ...
- winform下的智能提示框
winform下的智能提示框 最近在搞winform的程序,接触到有些可能以后还会用到的功能,所以写到博客园里去,第一可以加深自己的印象,第二可以在以后再遇到同样问题的时候忘记了可以马上回来看看,第三 ...
- 10. 星际争霸之php设计模式--原型模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- 记录一下我使用的vim的配置文件
还不是很完美: "au BufReadPost * if line("'\"") > 0|if line("'\"") &l ...
- retain,copy,assign及autorelease ,strong,weak
一,retain, copy, assign区别 1. 假设你用malloc分配了一块内存,并且把它的地址赋值给了指针a,后来你希望指针b也共享这块内存,于是你又把a赋值给(assign)了b.此时a ...
- 从表中删除重复记录的sql
--有一个表,假设是这样的 CREATE TABLE Test ( field1 ) primary key, field2 )); --假设field1上有索引. 要删除表中所有field1重复的记 ...
- 如何在普清的屏上调试CSS样式二倍图背景
背景: 最近就遇到一个同事的项目,还是像平常一样小心切图,认真对像素. 一切测试都没有问题,顺利上线. 但是,上线之后,产品经理跑过来说,有BUG. BUG描述:(不认为是BUG) 前端页面上的图标是 ...