学习笔记(二) 排序算法--快速排序

思想

从带排序序列中找一个基准点,用两个指针,一个从右边开始移动,找到比基准点小的数,一个从左边开始移动,找到比基准点大的数,交换这两个数,右边指针和左边指针继续移动,直到两个指针相遇,将基准点与相遇的位置交换,这样就得到了一个基准数左边的数一定小于基准数,右边的数一定大于基准数;继续递排序当前基准数左边的数列和右边的数列,直到排序完成。

图解

这里写图片描述

代码

void quickSort(int arr[],int start,int end)
{
    if (start >= end)
        return;
    int flag = arr[start];
    int left = start;//以第一个作为基数
    int right = end;
    while (left < right)
    {
        while (right > left)//从右边开始找一个比基数小的(一定要先从右边开始找)
        {
            if (arr[right] >= flag)
                right--;
            else
                break;
        }
        while (left < right)//从左边找一个比基数大的
        {
            if (arr[left] <= flag)
                left++;
            else
                break;
        }
        if (left < right)//还没有碰到,左右交换
        {
            int temp = arr[left];
            arr[left] = arr[right];
            arr[right] = temp;
        }

    }
    if (left == right)//碰到了,基数归位,确保了左边的值比基数小,右边的值比基数大
    {
        arr[start] = arr[left];
        arr[left] = flag;
    }

    quickSort(arr, start, left - 1);//继续排基数左边
    quickSort(arr, left + 1, end);//继续排基数右边
}
//测试代码
int main()
{
    int arr[] = { 1,5,3,4,1};
    quickSort(arr, 0, 4);
    for (int i = 0; i < 5; i++)
        cout << arr[i] << " ";
    cout << endl;

    system("pause");
    return 0;
}

输出结果:1 1 3 4 5
平均时间复杂度为O(nlogn)
优化:选择基准点可用随机函数选择

猜你喜欢

转载自blog.csdn.net/weixin_41212181/article/details/81355954