快速排序原理 及 代码展示

一. 快速排序简介

概述

快速排序由C. A. R. Hoare在1962年提出。快速排序是对冒泡排序的一种改进,采用了一种分治的策略。

基本思想

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

实现步骤

  1. 在队列中找出一个支点,通常是队列中最左边的数值;
  2. 设置两个哨兵位于队列两侧,通过有关操作将小于支点的数全放在支点左边,大于支点的数放在支点右边;
  3. 使用递归的思想对子序列分别进行快速排序,直到子序列元素个数为1时即完成排序;

二. 快速排序图解

以下面元素为例讲解快速排序算法:

  1. 将15设置为支点,并设置哨兵i,哨兵j ;
    在这里插入图片描述

  2. 首先移动哨兵j ,当找到比支点15小的数时,停止;
    在这里插入图片描述

  3. 将哨兵j对应数组位置的值赋给哨兵i对应的数组位置

在这里插入图片描述

可能会有疑问,此时数组中有两个2了,这是因为我们还没开始移动i;

  1. 移动哨兵i,找到大于支点15的数,停止;
    在这里插入图片描述

将此时i对应的值赋给j;
在这里插入图片描述

  1. 在移动j,找到比15小的数,若i,j相遇,则将支点的值赋给相遇的位置;
    在这里插入图片描述

这样,就完成了第一次排序,支点左边的数均小于15,右边的数均大于15,重复对子序列进行快排,直到子序列个数都是1则完成排序;

三. 算法代码

/*********************************************************************************
 *      Copyright:  (C) 2020 Xiao yang IoT System Studio
 *                  All rights reserved.
 *
 *       Filename:  QuickSort.cpp
 *    Description:  快速排序
 *                 
 *        Version:  1.0.0(04/25/2020)
 *         Author:  Lu Xiaoyang <[email protected]>
 *      ChangeLog:  1, Release initial version on "04/25/2020 10:58:15 AM"
 *                 
 ********************************************************************************/
#include <iostream>
using namespace std;

#define BUF_SIZE 8

/*******************************************************************************
 * 函数名:print
 * 功能:打印数组元素
 * 参数:arr - 要打印的数组,len:数组长度
 * 返回值:无
 ******************************************************************************/
void print(int arr[],int len)
{
    for(int i = 0; i < len; i++)
    {
        cout << arr[i] << "  ";
    }

    cout << endl;
}

/*******************************************************************************
 * 函数名:BubbleSort
 * 功能:以快速排序的方式排序数组
 * 参数:arr - 要排序的数组,low,high:数组的首下标和尾下标
 * 返回值:无
 ******************************************************************************/
void QuickSort(int arr[],int low,int high)
{
    if(low < high)
    {
        int i = low;
        int j = high;
        int pivot = arr[low];

        while(i < j)
        {
            while(i < j && arr[j] >= pivot) //找到比pivot小的数;
            {
                j--;
            }
            if(i < j)
            {
                arr[i++] = arr[j];
            }
            while(i < j && arr[i] < pivot) //找到比pivot大的数;
            {
                i++;
            }
            if(i < j)
            {
                arr[j--] = arr[i];
            }
        }

        arr[i] = pivot; //相遇后,将支点的值赋予此;

        QuickSort(arr, low, i - 1);     //递归调用;
        QuickSort(arr, i + 1, high);  
    }
}


int main()
{
    int arr[BUF_SIZE] = {0};

    cout << "请任意输入8个整型数字:" << endl;

    for(int i = 0; i < BUF_SIZE; i++)
    {
        cin >> arr[i];
    }

    cout << "在使用快速排序前数组顺序:" << endl;

    print(arr,BUF_SIZE);

    QuickSort(arr,0,BUF_SIZE-1);

    cout << "排序后,数组的顺序是" << endl;

    print(arr,BUF_SIZE);

    return 0;
}

运行:
在这里插入图片描述

四. 时间复杂度与稳定性


时间复杂度:最坏情况O(n^2),平均时间复杂度:O(N * lgN)

稳定性:不稳定

猜你喜欢

转载自blog.csdn.net/weixin_45121946/article/details/105748316