快速排序算法

来源:互联网 发布:app软件产品说明书 编辑:程序博客网 时间:2024/06/06 03:24

快速排序算法是目前为止排序算法中教好的一种,时间复杂度为O(n*logn)

下面先简单的写下,以后有时间再更新!欢迎大家的交流!

其思想是:

  1. 一趟的思想:先在数组中选择一个数字,接下来把数组中的数字分为两个部分,比选择的数字小的数字在数组的左边,比选择的数字大的数字在右边
  2. 递归的思路分别对于每次选中的数字的左右两边排序

第一步:实现分割的代码:有两种方式,看大家谢欢!

定义的两个指针顺序的朝着同一个方向:
int Partition(int data[], int length, int start, int end){    if (data == NULL || length <= 0 || start < 0 || end >= length)        throw new std::exception("Invalid Parameters");    int index = RandomInRange(start, end);    Swap(&data[index], &data[end]);    int small = start -1;    for (index = start; index < end; ++index){        if(data[index] < data[end]){            ++small;            if(small != index)                Swap(&data[index], &data[end]);        }    }    ++small;    Swap(&data[small], &data[end]);    return small;}

定义的两个指针是相向而行的:
int Partition(int data, int length, int start, int end){    if (data == NULL || length <= 0 || start < 0 || end >= length)        throw new std::exception("Invalid Parameters");    int pLeft = randomInRange(start, end);    Swap(&data[pLeft], &data[end]);    pLeft = start -1;    int pRight = end;    for(;;){        while(data[++pLeft] < data[end]){};        while(data[--pRight] > data[end]){};        if(pLeft < pRight)            Swap(&data[pLeft], &data[pRight]);        else            break;    }    Swap(&data[pLeft], &datap[end]);    return pLeft; }

注意:函数RandomInRange()是用来生成start和end之间的一个随机数,其实快熟排序还有一种选取分割点数字的方式是三位取中值,即取数字的第一个数字,中间一位数字和最后一位数字,取三个数字的中间值作为分割数,代码如下:
int middle3(int data, int length, int start, int end){    if (data == NULL || length <= 0 || start < 0 || end >= length)        throw new std::exception("Invalid Parameters");    int center = (start+end)/2;    if(data[start] > data[center])        Swap(&data[start], &data[center]);    if(data[center] > data[end])        Swap(&data[center], &data[end])    if(data[start] > data[center])        Swap(&data[start], &data[center]);    Swap(&data[center], &data[end]);   //将中间的分割数,交换到数组最后面 }

下面我们可以用递归的思想分别对于每次选中的数字左右两边进行排序。
 void QuickSort(int data[], int length, int start, int end){    if(start == end)        return;    int index Partition(data, length, start, end);    if(index > start)        QuickSort(data, length, start, index-1);    if(index < end)        QuickSort(data, length, index+1, end); }


代码可能有地方有问题,后期有时间我会测试修改!




0 0
原创粉丝点击