首页 > 代码库 > 快速排序算法(原理与实现)

快速排序算法(原理与实现)

简介:

快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

 

算法思想:

设要排序的数组A[0]……A[N-1],首先任意选取一个数据作为standard(通常选用数组的最后一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面(其实只要保证所有比他小的元素都在其前面,则后一条件则自动满足了),这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。(信息来源:百度百科)

 

C++实现:

 

#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;

bool initArray(int *Array, int arraySize)
{
    //初始化随机种子
    srand(time(NULL));
    for (int i = 0; i != arraySize; ++i)
    {
        //给数组用随机数赋值
        Array[i] = rand();
    }

    return true;
}

/*划分函数:
    使得在Array[i+1]之前的元素都小于该元素
    在Array[i+1]的元素都小于该元素
*/
template <typename T, typename Index_t>
Index_t partition(T *Array, Index_t prev, Index_t tail)
{
    T standard = Array[tail];
    Index_t i = prev - 1;   //i以及i之前的数,都小于standard

    for (Index_t j = prev; j != tail; ++j)
    {
        //数组的任意元素,只要其小于或等于standard,就将其换到数组的前半段
        //(因此,数组的后半段都是大于standard的元素)
        if (Array[j] <= standard)
        {
            ++ i;
            swap(Array[i],Array[j]);
        }
    }
    swap(Array[i+1],Array[tail]);

    //将standard的地址返回
    return i + 1;
}

template <typename T, class Index_t>
void quickSort(T *Array, Index_t prev, Index_t tail)
{
    if (prev < tail)
    {
        Index_t q = partition(Array,prev,tail);

        //对数组的前半段进行划分
        quickSort(Array,prev,q-1);
        //对数组的后半段进行划分
        quickSort(Array,q+1,tail);
    }
}

int main()
{
    int arraySize = 10;
    int *Array = new int[arraySize];

    initArray(Array,arraySize);
    quickSort(Array,0,arraySize-1);

    for (int i = 0; i != arraySize; ++i)
    {
        cout << Array[i] << endl;
    }

    delete Array;
}

快速排序算法(原理与实现)