绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
快速排序(C++实现)
2019-12-24 13:06:56

一、快速排序的基本实现

    快速排序算法是一种基于交换的高效的排序算法,它采用了分治法的思想:

        1、从数列中取出一个数作为基准数(枢轴,pivot)。 

        2、将数组进行划分(partition),将比基准数大的元素都移至枢轴右边,将小于等于基准数的元素都移至枢轴左边。

        3、再对左右的子区间重复第二步的划分操作,直至每个子区间只有一个元素。

    快排重要的一步就是划分了。划分的过程用通俗的语言讲就是“挖坑”和“填坑”。

二、快速排序时间复杂度

    快速排序的时间复杂度在坏情况下是O(N2),平均的时间复杂度是O(N*lgN)。这句话很好理解:假设被排序的数列中有N个数。遍历一次的时间复杂度是O(N),需要遍历多少次呢?至少lg(N+1)次,多N次。

        1、为什么少是lg(N+1)次?快速排序是采用的分治法进行遍历的,我们将它看作一棵二叉树,它需要遍历的次数就是二叉树的深度,而根据完全二叉树的定义,它的深度至少是lg(N+1)。因此,快速排序的遍历次数少是lg(N+1)次。

        2、为什么多是N次?这个应该非常简单,还是将快速排序看作一棵二叉树,它的深度大是N。因此,快读排序的遍历次数多是N次。

三、快速排序稳定性

      快速排序是不稳定的算法,它不满足稳定算法的定义。

      算法稳定性 -- 假设在数列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;并且排序之后,a[i]仍然在a[j]前面。则这个排序算法是稳定的!

    

四、代码实现

    
    int i = left + 1 ;
    int j = right;
    int temp = arr[left];

    while(i <= j)
    {
        while (arr[i] < temp)
        {
            i++;
        }
        while (arr[j] > temp )
        {
            j--;
        }
        if (i < j)
            swap(arr[i++], arr[j--]);
        else i++;
    }
    swap(arr[j], arr[left]);
    return j;

}

void quick_sort(int arr[], int left, int right) 
{
    if (left > right)
        return;
    int j = partition(arr, left, right);
    quick_sort(arr, left, j - 1);
    quick_sort(arr, j + 1, right);
}


分享好友

分享这个小栈给你的朋友们,一起进步吧。

长沙IT圈
创建时间:2019-10-25 09:32:10
结识长沙IT圈朋友、一起打酱油。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • abc
    栈主

小栈成员

查看更多
  • 栈栈
  • 54xx
  • amadan
  • abcjob
戳我,来吐槽~