快速排序(QuickSort)——数组

#对于快速排序的具体介绍就不用赘述了。这里记录几点要点。

  设定L0,R0为需排序数组的起点终点,L,R为检查到达的位置。

  选取数组的首端(L0)或者尾端(R0)元素为基准元素q,如果是L0则从R0开始往前检查,R0则从L0开始往后检查,很显然,这样的话基准元素q始终位于L或者R位置,最后排序完成时,R=L=q的位置。

  快速排序是一种就地排序(就地排序就按照字面意思理解即可),L前的和R后的位置是已经检查排序完了的。这也是为什么一直交换R,L就可以排序完成的原因,这样交换可以不去创造新的空间。

  时间复杂度最坏情况O(n^2),期望情况O(nlgn)。

#代码实现:

int num[];                         //排序的数组num

//交换num[L],num[R]

void swap(int L,int R)
{
    int temp;
    temp=num[L];
    num[L]=num[R];
    num[R]=temp;
}

//降序排序
void QS(int L,int R)
{
    int q;                 //设定基准值q
    int L0=L;           //需排序的数组左端
    int R0=R;          //需排序的数组右端
    q=num[R];        //q取尾端元素
    while(L<R)        

    {

       //找到左端比q小的数,交换

       while(num[L]>=q&&R>L)
           L++;
       swap(L,R);

       //左端寻找完一次,从右端开始,找到右端比q大的数,交换

       while(num[R]<=q&&R>L)
           R--;
       swap(L,R);
    }

    //分治(递归)

    if(R>L0)
       QS(L0,R-1);
    if(L<R0)
       QS(L+1,R0);
}

#函数库

快速排序函数

qsort(void*begin,int num,int width,int (*f)(const void*a,const void*b));包含在stdlib.h中

begin为排序开始地址,num为需排序元素个数,width为每个元素的大小,f为指向比较函数的指针(比较函数通常自己写,qsort();得到返回值,return 负; 表示a<b,return 0; 表示a=b, return 正; 表示a>b)


猜你喜欢

转载自blog.csdn.net/u014302425/article/details/80028420