重温经典排序算法之快速排序——图解+C/C++实现

1.快速排序原理

对于要排序的数组,首先任意选取一个数据(通常为首元素)作为关键数据,将序列中所有比该元素小的元素都放到它的左边,将所有比它大的元素都放到它的右边,再对左右两边分别用同样的方法直到每一个待处理的序列长度为1,排序结束。

2.算法性能分析

(1)时间复杂度

a.最好情况的时间复杂度:每次划分所选择的关键数据均为所在序列的中位数,则经过logn趟划分即可得到长度为1的子序列,此时的时间复杂度为 O ( n l o g 2 n ) O(nlog_2n)
b.最坏情况的时间复杂度:每次划分所选择的关键数据均为所在序列的最大或最小,则需要经过n趟划分才能得到长度为1的子序列,此时的时间复杂度为 O ( n 2 ) O(n^2)
平均时间复杂度为 O ( n l o g 2 n ) O(nlog_2n)

(2)算法稳定性

若一个序列为(3(1),8,2,9,1,3(2)),则经过第一趟(3(2),1,2,3(1),9,8),此时两个相同数的相对位置就发生了变化,因此快速排序算法是一种不稳定的排序算法。

3.图解分析

原始序列为[3,5,8,2,9,1]
第一趟排序的图解如下:
在这里插入图片描述
第一趟排序将该序列分为两个子序列[1,2]和[8,9,5],接着按相同的方法将两个子序列进行排序;
第二趟排序之后的结果为[1,2,3,5,8,9],该序列已经为有序序列,排序结束。

4.C/C++实现

#include<iostream>
using namespace std;
void QuickSort(int a[],int low,int high)
{
    if(low>=high) return;//此时已经完成排序,直接返回
    int i = low;
    int j = high;
    int key = a[low];
    while(i<j)//实现第一趟排序
    {
        while(i<j&&key<a[j]) j--;//从右向左找比key小的值
        a[i] = a[j];
        while(i<j&&key>a[i]) i++;//从左向右找比key大的值
        a[j] = a[i];
    }
    a[i] = key;//将关键数据填入low=high的位置
    QuickSort(a,low,i-1);//左边子序列递归排序
    QuickSort(a,i+1,high);//右边子序列递归排序
}
int main()
{
    int a[] = {3,5,8,2,9,1};
    int num = 6;
    QuickSort(a,0,num-1);
    for(int i = 0;i<num;i++)
        cout<<a[i]<<" ";//输出1 2 3 5 8 9
    return 0;
}

运算结果为:
在这里插入图片描述

发布了20 篇原创文章 · 获赞 16 · 访问量 1285

猜你喜欢

转载自blog.csdn.net/SAMSARS/article/details/105332284
今日推荐