Sort排序专题(5)快速排序(QuickSort)(C++实现)

快速排序(QuickSort)

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

图解如下:
QuickSort
①以数组第一个元素49作为参考,比他大的放到他的右边,比他小的放到他的左边。
②分别对其左右两边依次进行①的操作,进行递归。
③重复循环进行①②操作。

代码实现

#include<bits/stdc++.h>
using namespace std;

void QuickSort(int *arr,int l,int r)
{
    if(arr == NULL || l >= r)  return ;
    int lid = l,rid = r,Tmp;
    while(lid < rid)                                       //选出arr[l]作为标准参考元素
    {
        while(lid < rid && arr[rid] >= arr[l]) rid--;     //从右往左找第一个比参考元素小的值位置
        while(lid < rid && arr[lid] <= arr[l]) lid++;     //从左往右找第一个比参考元素大的值的位置
        Tmp = arr[lid];                     //交换arr[lid]和arr[rid],交换上面找到的两个元素的位置
        arr[lid] = arr[rid];                //当使用异或进行值的交换时候必须保证两个数不为同一个数。
        arr[rid] = Tmp;
    }
    Tmp = arr[lid];                         //交换arr[l]和arr[lid]位置,交换参考元素和交换后的lid位置
    arr[lid] = arr[l];                      //交换完了就实现了参考元素左边都是小于其值,右边都是大于其值的
    arr[l] = Tmp;
    QuickSort(arr,l,lid-1);                 //递归实现参考元素左边的有序化
    QuickSort(arr,lid+1,r);                 //递归实现参考元素右边的有序化
}

int main()
{
    int *arr = NULL;                  //指针==数组  指针需要初始化
    int n,len;
    cin>>n;
    arr = (int*)malloc(sizeof(int)*n);   //指针使用需要malloc空间(malloc空间虚拟地址连续,物理地址不一定连续)
    for(int i = 0; i < n; i++)
    {
        cin>>arr[i];
    }
    QuickSort(arr,0,n-1);
    for(int i = 0; i < n; i++)
    {
        cout<<arr[i]<<" ";
    }
    free(arr);
    arr = 0;
    return 0;
}


时间复杂度

快速排序的一次划分算法从两头交替搜索,直到L和R重合,因此其时间复杂度是O(n);而整个快速排序算法的时间复杂度与划分的趟数有关。
理想的情况:每次划分所选择的中间数恰好将当前序列几乎等分,经过log2n趟划分,便可得到长度为1的子表。这样,整个算法的时间复杂度为O(nlog2^n)
最坏的情况:每次所选的中间数是当前序列中的最大或最小元素,这使得每次划分所得的子表中一个为空表,另一子表的长度为原表的长度-1。这样,长度为n的数据表的快速排序需要经过n趟划分,使得整个排序算法的时间复杂度为O(n^2)。
快速排序的平均时间复杂度也是O(nlog2n)。因此,该排序方法被认为是目前最好的一种内部排序方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值