码迷,mamicode.com
首页 > 编程语言 > 详细

快速排序

时间:2015-11-22 20:25:12      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:

先看函数:void Qsort(int* arr, int beg, int end);

我们给它赋予一个功能:把数组中的第beg个元素放到区间【beg, end】有序时该有的位置。

递归实现排序:

void QSort(int* arr, int beg, int end)
{
        if(beg >= end)
        return;
        //...把arr中的第beg个元素放到区间【beg, end】有序时该有的位置MyPosition。
        /*
            然后把MyPosition前面的数和MyPosition后面的数进行递归调用,将实现把每一个值都
            放到有序时该有的位置。
        */
        QSort(arr, beg, MyPosition-1); //(1)
        QSort(arr, MyPosition+1, end);//(2)
}

下面我们实现把数组中的第beg个元素放到区间【beg, end】有序时该有的位置。

int getPartitionPt(int* arr, int beg, int end)
{
    int first = beg;
    int last = end;
    int key = arr[beg];

    while(last > first)
    {
        if(arr[last] > key)
            //右边一直往左边搜索,找到比关键值小的数
        {
            last--;
            continue;
        }
        
        if(arr[first] <= key)
            //左边一直往右边搜索,找到比关键值大的数
        {
            first++;
            continue;
        }
            //交换两值
        mySwap(arr[first], arr[last]);
    }
    //当退出while的时候first == last,且对应位置的值将比关键值小。
    //所以与关键值进行交换就实现了 数组中的第beg个元素放到区间【beg, end】有序时该有的位置。
    mySwap(arr[beg], arr[first]);
    return first;
}

方法2:

int getPartitionPt(int* arr, int beg, int end)
{
    int key = arr[beg];
    int nSwap = beg+1;

    for(int i=beg+1; i<=end; i++)
    {
        if(arr[i]< key)
        {
            mySwap(arr[i], arr[nSwap]);
            nSwap++;
        }
    }
    mySwap(arr[beg], arr[nSwap-1]);

    return nSwap-1;
}

由此,我们实现了完整的快排:

void QSort(int* arr, int beg, int end)
{
    if(beg >= end)
        return;
    int MyPosition = getPartitionPt(arr, beg, end);
    QSort(arr, beg, MyPosition-1);
    QSort(arr, MyPosition+1, end);
}

 

  

 

快速排序

标签:

原文地址:http://www.cnblogs.com/wrbxdj/p/4986452.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!