快速排序的两种实现
2015-07-29 14:51
204 查看
简介
快速排序是排序中速度比较快的,采用分治策略,不断递归排序。很多编程语言的sort()或者qsort()函数的底层实现就是快排。算法导论第7章对快速排序进行了深入的探讨,而且它的划分思想与国内的许多教材不同。如严蔚敏数据结构版本选择第一个元素为中枢,从左右两端往中间逼近;而算法导论则是选择最后一个元素为中枢,两个指针一起从左到右遍历一遍进行划分。(选择中枢也是个值得探讨的问题,算法导论采取随机法)
算法导论版快排
代码:
交换用的宏定义,数组初始化&输出函数#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <ctype.h> #include <time.h> #include<windows.h> #define SWAP(a,b) do { temp = (a);\ (a) = (b);\ (b) = (temp);}while(0); //随机生成N个整数 void init_array(int a[],int n) { int i ; srand((int)time(NULL)); for (i=0;i<n;i++) //随机生成 0 - 100 { a[i] = rand()%100 ; } printf("随机生成了 %d 个整数 \n",n); for (i=0;i<n;i++) { printf("%d ",a[i]); } printf("\n"); } //打印数组元素 void showArray(int a[],int n) { int i ; printf("现在数组中的序列为:\n"); for (i=0;i<n;i++) { printf("%d ",a[i]); } printf("\n"); }
//************ 快速排序---算法导论思想前后指针 ****************** int sort_Patition_JBefore(int a[],int low ,int high) { int i,j; int pivot = a[high]; //数组最后一个元素作为分割值 for (i=low-1,j=low; j < high ; j++) { if (a[j]<=pivot) // 注意 < 不可以,要<= { i++; SWAP(a[i],a[j]); } } SWAP(a[i+1],a[high]); return i+1; } void QuickSort_Jbeofore(int a[],int low ,int high) { int pivot ; if (low<high) { pivot = sort_Patition_JBefore(a,low,high); QuickSort_Jbeofore(a,low,pivot-1); QuickSort_Jbeofore(a,pivot+1,high); } }
运行结果:
严蔚敏版本快排
相关文章推荐
- html加载顺序、onload、JQ.ready()
- Maven项目模板
- LeetCode(78) Subsets
- css弹出遮罩层
- 快速清除Andorid项目中无用资源
- 浅拷贝和深拷贝
- Android实例-退出程序(XE8+小米2)
- Easyui 中的placeholder属性
- 启动spark集群
- Oracle 学习之RMAN(三)全量备份
- 【转】深入剖析ConcurrentHashMap(2)
- spring环境搭建
- Android新闻类界面分享(多种布局的listview)
- CoreAnimation之制作阴影
- 对于HTTP URL中非法字符的处理方法
- android 判断当前应用是否与服务器连接成功
- css3复选框
- Log4net 自定义字段到数据库
- 大牛的博客
- Understanding basic of Report creation