据说这是一种能够快速计算进行排序的算法,刚才发现一件很不开心的事情,博客上有一些代码莫名其妙被删去了,算啦,删掉也好,下次看到的时候就会努力去思考这几个地方应该写什么,就不用直接copy了!!
大概了解了一下它的算法步骤,一开始就是先利用之前的序列划分算法将其分为两部分,然后将这两部分又分别进行序列划分,多次重复进行序列划分后就得到最后全部排好序的数组。(感觉跟前面的归并排序差不多,就底层的运算节奏不一样,果然是年轻呀!!!)
算法伪代码:
RANDOMIZED-PARTITION(A,p,r)
1. i<-RANDOM(p,r)
2. exchange A[r]<->A[i]
3. return PARTITION(A,p,r)
RANDOMIZED-QUICKSORT(A,p,r)
1. if p<r
2. then q<-RANDOMIZED-PARTITION(A,p,r)
3. RANDOMIZED-QUICKSORT(A,p,q-1)
4. RANDOMIZED-QUICKSORT(A,q+1,r)
C++:
partition.h
#define _partition_h
#include<stdlib.h>
#include<iterator>
using namespace std;
int randomNumber(int p,int q){
return p+(int)rand()%(q-p);//rand()%100;表示获得一个100以内的随机数,其结果在[0-99]中
}
template <typename Iterator,typename Comparator>
Iterator randomizedPartition(Iterator p,Iterator r,Comparator comp){
int n=distance(p,r),i;
Iterator q=p,t=r;
i=randomNumber(0,n-1);
advance(q,i);
iter_swap(q,–t);
return stable_partition(p,r,bind2nd(comp,*t));//调用了序列划分算法
}
quicksort.h
#define _quicksort_h
#include”partition.h”
template<typename Iterator,typename Comparator>
void quicksort(Iterator p,Iterator r,Comparator comp){
long n=distance(p,r);
if(n>1){
Iterator q=randomizedPartition(p,r,comp);
quicksort(p,q,comp);
quicksort(q,r,comp);
}
}
main.cpp
#include “mergesort.h”
#include <iostream>
#include <vector>
#include <list>
#include <iterator>
#include”quicksort.h”
using namespace std;
int main(){
int a[]={5,1,9,4,6,2,0,3,8,7},i;
string b[]={“ChongQing”,”ShangHai”,”AoMen”,”TianJing”,”BeiJing”,”XiangGang”};
double c[]={8.5,6.3,1.7,9.2,0.5,2.3,4.1,7.4,5.9,3.7};
quicksort(a,a+10,less<int>());//进行升序
copy(a,a+10,ostream_iterator<int>(cout,” “));
cout<<endl;
quicksort(c,c+10,greater<double>());
copy(c,c+10,ostream_iterator<double>(cout,” “));//进行降序
cout<<endl;
}
JAVA:
LinearList.java
package test;
import java.util.*;
public class LinearList {
public static int randmizedPartition(List a,int p,int r,Comparator comp) {
int i=p+(int)((double)(r-p)*Math.random());
Collections.swap(a,i,r);
return partition(a,p,r,comp);
}
}
Sort.java
import java.util.*;
public class Sort {
static public void quicksort(List<Comparable> a,int p,int r,Comparator comp) {
if (p<r) {
int q=LinearList.randmizedPartition(a, p, r, comp);
quicksort(a,p,q,comp);
quicksort(a,q+1,r,comp);
}
}
}
Test.java
package test;
import java.util.*;
public class Test{
public static void main(String[] args){
Integer a[]= {5,1,9,4,6,2,0,3,8,7},i;
String b[]= {“ChongQing”,”ShangHai”,”AoMen”,”TianJin”,”BeiJing”,”XiangGang”};
Double c[]= {8.5,6.3,1.7,9.2,0.5,2.3,4.1,7.4,5.9,3.7};
ArrayList A=new ArrayList();
for(i=0;i<10;i++)
A.add(a[i]);
Vector B=new Vector();
for(i=0;i<6;i++)
B.add(b[i]);
LinkedList C=new LinkedList();
for(i=0;i<10;i++)
C.add(c[i]);
Sort.quicksort((List)A, 0, 9,new Greater());//升序
System.out.println(A);
Sort.quicksort((List)B, 0, 5,new Less());//降序
System.out.println(B);
Sort.quicksort((List)C, 0, 9,new Greater());
System.out.println(C);
}
}