快速排序

来源:互联网 发布:source linux命令 编辑:程序博客网 时间:2024/05/16 02:31

                                                            快速排序

                  1、算法思想:

                                    主要是你要找到一个基准,将数组分成两半,左边的全部小于基准值key右边的全部大于基准值key,这样就可以将数组分成两半,采用分治的思想,减少了算法的复杂度

                 2、实现方法:

                                  第一步:从右往左找,找到第一个小于key的数

                                  第二步:从左王右找,找到第一个大于key的数

                                  第三步:前两步,完成之后,交换他们的值

                                  第四步:将key的值放在中间

                                 第五步:利用递归的方式进行实现排序

                      注*这里要说明的问题是swap(int a, int b)在交换中容易出现的错误 如果a没有值的话,(值定义一个 int  a=Q[e] )  b有一个切确的值5   在这里是不能整场交换的

                                所以要采用swap(int * a,int *b);  去交换他们的地址,这样才能正常完成交换,达到你所需要的功能

               3、复杂度分析(最好的请况)

                               首先:将数组分成log(n)层,,但是每一层都要调用n次 那么则是nlog(n)次 复杂度为O(nlog(n));

               4、源代码( 这里提供算法导论版本的)

#include<iostream>#include<ctime>#include<cstdlib>using namespace std;void swap(int *a, int *b){    int tmp;    tmp = *a;    *a = *b;    *b = tmp;}int partion(int a[], int p, int r){    int i, j ;    srand((unsigned)time(NULL));    int e = rand()%(r-p+1) + p;    swap(&a[e], &a[r]);    int key = a[r];    i = p-1;    for(j = p; j < r; j++)    {        if(a[j]<=key)        {            swap(&a[i+1],&a[j]);            i++;        }    }    swap(&a[i+1], &a[r]);    return i+1;}void QuickSort(int a[], int p, int r){   //这个条件是因为    if(p <r)    {        int q = partion(a, p, r);        QuickSort(a, p, q-1 );        QuickSort(a, q+1,r);    }}int main(){    int array[]={0,-2,11,-4,13,-5,14,-43};    QuickSort(array,0,7);    for(int i=0;i<=7;i++)        cout<<array[i]<<" ";    cout<<endl;    return 0; }

还有Hoare版本。。。。。。。。

 

原创粉丝点击