5.快速排序算法

据说这是一种能够快速计算进行排序的算法,刚才发现一件很不开心的事情,博客上有一些代码莫名其妙被删去了,算啦,删掉也好,下次看到的时候就会努力去思考这几个地方应该写什么,就不用直接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);

}

}

点赞