快速排序的实现

算法简介:

快速排序(Quicksort)是对 冒泡排序的一种改进。

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

为什么说快速排序是冒泡排序的一种改进呢?

简单来说,冒泡排序和快速排序的思路都是小的往前移动,大的往后移动。但是,冒泡排序是一个个元素进行比较再移动。而快速排序是从整体到个体,采用分治的算法思想去处理,移动的是序列,较小的序列前移,较大的后移,所以说快速排序是冒泡排序的一种改进

代码实现

void quickSort(int arr[], int l, int r)
{
    if(l >= r)
    {
        return;
    }
    int mid = partition(arr,l,r);
    quickSort(arr,l,mid-1);
    quickSort(arr,mid+1,r);
    return;
}

int partition(int arr[], int l, int r)
{
    int v = arr[l];
    //arr[l+1....j] < v; arr[j+1....i) >v
    int j = l;
    for(int i = l+1; i <= r; i++)
    {
        if(arr[i] < v)
        {
            swap(arr,j+1,i);
            j++;
        }
    }
    swap(arr,j,l);
    return j;
}
void swap(int arr[], int a, int b)
{
    int t = arr[a];
    arr[a] = arr[b];
    arr[b] = t;
    return;
}

算法核心在于partition函数对左右两个区间的移动,既选取一个标尺值(这里是v),使得当前序列满足条件arr[l+1.....j] < v ; arr[j+1.......l] >v ,注意定义边界,将l指向的元素作为标尺并预留,然后遍历数组进行交换时从l+1出开始

猜你喜欢

转载自blog.csdn.net/reinnovation/article/details/79341280