C语言-快速排序

概况

快速排序(Quick sort)是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1960年提出。

算法思路

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

快速排序算法通过多次比较和交换来实现排序,其排序流程如下:

1、首先设定一个分界值,通过该分界值将数组分成左右两部分。

2、将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。

3、然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。

4、重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。
 

流程如下图所示:

C语言-快速排序_第1张图片

 基本思想如下图所示:

C语言-快速排序_第2张图片

 快速排序之所以比较快,是因为与冒泡排序相比,每次的交换时跳跃式的,每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样每次只能在相邻的数之间进行交换,交换的距离就大的多了。因此总的比较和交换次数就少了,速度自然就提高了。当然在最坏的情况下,仍可能是相邻的两个数进行了交换。

代码实现如下:

#include
#include
//快速排序
void PrintAr(int* ar, int n)
{
    assert(ar != nullptr);
    for (int i = 0; i < n; ++i)
    {
        printf("%5d", ar[i]);
    }
    printf("\n");
}
int Parition(int* ar, int left, int right)
{
    assert(ar != nullptr);
    int i = left, j = right;
    int tmp = ar[i];
    while (i < j)
    {
        while (i < j && ar[j] > tmp) --j;
        if (i < j) { ar[i] = ar[j]; }
        while (i < j && ar[i] <= tmp) ++i;
        if (i < j) { ar[j] = ar[i]; }
    }
    ar[i] = tmp;
    return i;
}

void QSort(int* ar, int left, int right)
{
    if (left < right)
    {
        int pos = Parition(ar, left, right);
        QSort(ar, left, pos - 1);
        QSort(ar, pos + 1, right);

    }
}
void QuickSort(int* ar, int n)
{
    assert(ar != nullptr);
    QSort(ar, 0, n - 1);
}
int main()
{
    int ar[] = { 56,90,78,67,23,100,12,45,34,89 };
    int n = sizeof(ar) / sizeof(ar[0]);

    QuickSort(ar, n);
    PrintAr(ar, n);

    return 0;
}

运行结果如下:

C语言-快速排序_第3张图片

 

你可能感兴趣的:(C语言,c语言,排序算法,算法)