快速排序,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的快速 ...
随机推荐
- java小知识点
1 判断是否为win系统 int version=System.getProperty("os.name").toLowerCase().indexOf("windows ...
- maven基础学习
项目结构 src -main -java -package -test -java ...
- Java maven安装GDAL
1. 使用编译好的安装jdal http://www.gisinternals.com/release.phpgdal-111-1800-x64-core.msi下载地址:http://downloa ...
- Linux内核中大小端判定宏
#include <stdio.h> ];unsigned long mylong;} endian_test = { {'l','?','?','b'} }; #define ENDIA ...
- [Android Tips] 5. INSTALL_PARSE_FAILED_MANIFEST_MALFORMED on Android-2.1
最近在 http://testin.cn 上的多款 android 2.1 设备上出现安装失败的问题 INSTALL_PARSE_FAILED_MANIFEST_MALFORMED 问题分析 貌似 a ...
- leetcode 374
这个题目很简单,但是要注意细节和对题目的理解,一开始我把guess函数的作用理解错了,第一版代码长这样: int guessNumber(int n) { ; int high = n; while( ...
- IDEA14下多jdk编译时,enum不支持;多个project共用在一个workplace下每个module时引用外部包
idea多个工程如何在一个项目中管理: 把多个多个项目放在一个叫work目录下,那么打开IntelliJ IDEA编译器,点击菜单 File->Open...,选择刚刚的work目录,即可. 在 ...
- 免费的网络扫描器-Advanced IP Scanner
软件会自动检测电脑所在的网段,自动决定扫描范围.(例如电脑IP是192.168.1.101,扫描范围就是192.168.1.*) 官方网站:http://www.advanced-ip-scanner ...
- Java 之 List<T> 接口的实现:LinkedList
Collection├List│├LinkedList│├ArrayList│└Vector│ └Stack└SetMap├Hashtable├HashMap└WeakHashMap 隶属于队列Lis ...
- shell脚本 空格
1.定义变量时, =号的两边不可以留空格. eg: gender=femal----right gender =femal---–wrong gender= femal---–wrong 2.条件测试 ...