快速排序是一种高效的非稳定排序,它的基本思路是分支法,在一个序列a[]中找到一个数a[mid],然后将序列a[]分为3部分a[start]---a[i-1],a[i],a[i+1]---a[end],第一部分的序列中,所有的数都小于a[i],第二部分的序列中,所有的数都大于a[i]。然后递归的对前后两部分进行处理,直到序列完成排序。
那么快速排序的关键步骤就是对序列进行重排。有两种思路1)单向扫描。2)双向扫描。
单向扫描:根据算法导论第二版他的算法流程为:
PARTITION(A, p, r) 1 x ← A[r] //以最后一个元素,A[r]为主元 2 i ← p - 1 3 for j ← p to r - 1 //注,j从p指向的是r-1,不是r。 4 do if A[j] ≤ x 5 then i ← i + 1 6 exchange A[i] <-> A[j] 7 exchange A[i + 1] <-> A[r] //最后,交换主元 8 return i + 1
可以看到,以序列的最后一个元素为基准元素,从序列头部开始扫描,如果发现a[i]小于基准元素,将他交换到序列前部(注意前部指针交换一次就加1)
双向扫描:
OARE-PARTITION(A, p, r) 1 x ← A[p] 2 i ← p - 1 3 j ← r + 1 4 while TRUE 5 do repeat j ← j - 1 6 until A[j] ≤ x 7 repeat i ← i + 1 8 until A[i] ≥ x 9 if i < j 10 then exchange A[i] <-> A[j] 11 else return j
可以看到,扫秒从2头开始,如果发现a[i]>mid&&a[j]<mid将两者交换,注意基准元素为a[p],最后返回的是j
最后给出具体代码,附带了随机化版本:
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<time.h> using namespace std; void swap(int *src,int a,int b) { int temp=src[a]; src[a]=src[b]; src[b]=temp; } int partition(int* src,int start,int end) { int result; int i=start; int j=end; int mid=src[start]; end=end+1; while(1) { while(src[++start]<mid&&start<j); while(src[--end]>mid); if(start>=end) break; swap(src,start,end); } swap(src,i,end); return end; } int partition_single(int*src,int start,int end) { int mid=src[end]; int i=start-1; for(int j=start;j<end;j++) { if(src[j]<=mid) { ++i; swap(src,i,j); } } swap(src,i+1,end); return i+1; } int randomPartition(int*src,int start,int end) { srand(time(NULL)); int n=rand()%(end-start+1); int r=start+n; swap(src,start,r); return partition(src,start,end); //return partition_single(src,start,end); } void q_sort(int *src,int start,int end) { if(start>=end) return; //int result=partition(src,start,end); //int result=partition_single(src,start,end); int result=randomPartition(src,start,end); q_sort(src,start,result-1); q_sort(src,result+1,end); } int main() { int src[16]={16,11,15,9,10,13,14,8,2,1,5,12,6,3,7,4}; q_sort(src,0,15); for(int i=0;i<16;i++) cout<<src[i]<<" "; cout<<endl; return 0; }
发表评论
-
图的割点tarjan---zoj_1119
2011-10-24 23:00 1232http://acm.zju.edu.cn/on ... -
BFS与双向BFS---zoj_1505
2011-10-09 17:14 1642http://acm.zju.edu.c ... -
静态treap+线段树---zoj_2112
2011-09-29 23:06 1708http://acm.zju.edu ... -
NIM博弈游戏,SG函数---zoj_3084,zoj_2083
2011-09-23 23:00 1316Nim游戏是两个人进行的游戏有如下规则: ... -
多重背包--zoj_2156
2011-09-14 11:10 864首先介绍经典的三种背包问题,0-1背包,完全 ... -
模式串匹配---KMP
2011-08-31 20:49 1277朴素的的模式串匹配算法通常要在向前移动文本指针 ... -
八数码问题(A*&&双向BFS)---zoj_1217
2011-08-30 22:13 1665题目地址:http://acm.zju.edu.cn/onli ... -
ac自动机以及它上面的DFA
2011-08-08 23:04 2479AC自动机(Aho-Corasick)主要用 ... -
二分图最大匹配(匈牙利算法)--zoj1516,1525,2223
2011-07-20 22:36 1187二分图G(E,V)将点集合V分成两个部分L,R ... -
网络最大流(EK)---zoj_1734
2011-07-19 16:34 2131网络最大流是图论中的一个典型问题,为了精确的定 ... -
trie和前缀检查---zoj_2876
2011-07-13 23:03 868trie树是一种多叉树,广泛用于字典检索。如 ... -
位图bitmap
2011-07-13 21:08 915bitmap是一种广泛使用的数据结构,主要用在 ... -
LAC和RMQ的转化---zoj_3195
2011-07-12 22:35 1073我擦。。纠结了好久啊,从SF到TLE,先总结2 ... -
LAC的tarjan(离线)算法---zoj_1141
2011-07-08 17:52 1660LCA就不解释了,这里主要再次复习一下LC ... -
笛卡尔树以及treap---zoj_2243
2011-07-07 15:52 2841zoj_2243笛卡 ... -
线段染色,矩形切割,离散化---zoj_2301,zoj_1128
2011-06-24 22:32 1366染色问题:在一维坐标轴上(最右端为M),有N ... -
线段树---zoj_1610
2011-06-22 21:06 746线段树是一种二叉树的拓展,在线段树每个节点中 ... -
斐波那契散列
2011-06-16 16:38 3073斐波那契散列法其实是一种特殊的乘法散列,先来看乘法 ... -
强连通分支(scc)---tarjan
2011-06-15 16:17 1284本文大量 ... -
单源最短路径SPFA---zoj3146
2011-06-09 15:25 941针对Bellman-Ford算法效率比较低 ...
相关推荐
C快速排序qsort,对一个数据数组进行快速排序
qsort总结.pdf快速排序总结qsort总结.pdf快速排序总结qsort总结.pdf快速排序总结 还有实现代码
快速排序 qsort 一个模版函数 较为简洁的代码。
快速排序库函数qsort的调用细则,内容很详尽,适合新手阅读!
鉴于初学C语言或C++时对快速排序算法的了解不够深入,在此上传快速排序的C语言实现代码,该实现代码具有模块化特点,并且在代码中写了注释,并在调试过程中易出错的关键地方做了标注;此外,在代码实现中添加了良好...
比如二维数组,如何根据其中的一维来进行快速排序。 这里可以考虑用结构体来实现
qsort的具体实现,有注释。 排序函数:int findpivot(int i, int j, int a[]); void swap(int l, int r, int a[]); int partition(int i, int j, int pivot, int a[], int pivotindex); void quicksort(int i, int j...
快速排序算法C语言实现快速排序算法C语言实现 www.edsionte.com/techblog
#include #include #include ... //快速排序 void QSort(SqList &,int,int); //子序列快速排序 int Partition(SqList &,int,int); //一趟快速排序 void PrintSqList(SqList); //显示表中的所有元素
C函数快速排序 简介及用法
在学习C++ STL的sort函数,发现C中也存在一个qsort快速排序,要好好学习下C的库函数啊
c语言中一种快速的排序方法qsort,qsort的排序方法的具体行事和各种形式的详细举例说明。可以省去很多不必要的比较和循环
七种快速排序算法,sort,qsort。。
数据结构,排序算法,快速排序算法的C语言实现, quick sort C qsort.c an c implementation of quick sort
7中类型的数据怎么样快速排序齐全,包括记住的数据,以及结构体,二级排序,结构简单,拿来就能用,不必自己再重复写快拍的的麻烦代码,不过如果要求时间较高的话建议自己写
void qsort(int arr[],int left,int right) //qsort()函数实现快速排序,并且是递归调用,而且,递归调用qsort()函数本身两次,因为要对中值两边的 { //部分分别进行排序。arr是待排序的数组名,left是排序的左边界,...
procedure qsort(l,r:longint); var k,t,i,j:longint; begin k:=(l+r)div 2; t:=a[k]; i:=l; j:=r; repeat
C语言qsort快排函数的模版,帮助深入认识模版的快速高效的风格。
C++中的快速排序,Qsort函数详细详解。并且有各种例子