一. 快速排序简介
概述
快速排序由C. A. R. Hoare在1962年提出。快速排序是对冒泡排序的一种改进,采用了一种分治的策略。
基本思想
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
实现步骤
- 在队列中找出一个支点,通常是队列中最左边的数值;
- 设置两个哨兵位于队列两侧,通过有关操作将小于支点的数全放在支点左边,大于支点的数放在支点右边;
- 使用递归的思想对子序列分别进行快速排序,直到子序列元素个数为1时即完成排序;
二. 快速排序图解
以下面元素为例讲解快速排序算法:
-
将15设置为支点,并设置哨兵i,哨兵j ;
-
首先移动哨兵j ,当找到比支点15小的数时,停止;
-
将哨兵j对应数组位置的值赋给哨兵i对应的数组位置
可能会有疑问,此时数组中有两个2了,这是因为我们还没开始移动i;
- 移动哨兵i,找到大于支点15的数,停止;
将此时i对应的值赋给j;
- 在移动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)
稳定性:不稳定