【算法】快速排序

简介: 快速排序是一种非常高效的算法。首先排序速度比较快,这个从名字就可以看出来,快速排序的平均时间复杂度为O(nlogn),最坏情况为O(n2),最好情况为O(n)。

算法简介

  快速排序是一种非常高效的算法。首先排序速度比较快,这个从名字就可以看出来,快速排序的平均时间复杂度为O(nlogn),最坏情况为O(n2),最好情况为O(n)。而且快速排序是一种原地排序算法,只需要很小的栈作为辅助空间,很适合大数据集的比较。

算法思想

  快速排序算法是分为分割和递归两部分。分割指的是将选取一个基准值,然后将序列分割为左边小于该基准值,右边大于该基准值两部分。 递归指的是分别对左边和右边两部分再次分割,当递归到底时,序列便排序完成。

快速排序流程如下

快速排序示意图

代码实现

void swap(int* a,int* b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

//分割代码,将序列 区间[l,r-1]分为[l,j],[j+1,r]两部分
int partation(int arr[],int l,int r)
{
     int select = arr[l];
    int index = l;
    for(int i=l;i<r;i++){
        if(arr[i] < select){
            swap(&arr[index+1],&arr[i]);
            index++;
        }
    }
    swap(&arr[l],&arr[index]);
    return index;

}

//递归代码: 对数组区间为[l,r)区间内元素进行快速排序
void QuickSort(int arr[],int l,int r)
{
    if(l>=r) return;
    int pip_index = partation(arr,l,r);
    QuickSort(arr,l,pip_index);
    QuickSort(arr,pip_index+1,r);
}

  上面便是快速排序的基本实现原理,但是上述代码有一点缺陷,如果需要排序的序列内重复的元素非常多,会大大影响快速排序的效率,下面为大家介绍一下三路快排的思想以及实现代码

  三路快排的实现思想非常简单,顾名思义,就是将序列分为三部分,小于基准值,等于基准值,大于基准值这三部分。

void swap(int* a,int* b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

//三路快排: 对数组区间为[l,r)区间内元素进行快速排序
void QuickSort(int arr[],int l,int r)
{
    int i = l+1;   
    int select = arr[l];
    int sm_idx = l; //区间[l+1,sm_idx]
    int bg_idx = r; //区间[bg_idx,r)
    
    if(l >= r)return;    
    
    while(i<bg_idx){
        if(arr[i] < select){
            swap(&arr[i],&arr[sm_idx+1]);
            sm_idx++;
            i++;
        }else if(arr[i] > select){
            swap(&arr[i],&arr[bg_idx-1]);
            bg_idx--;
        }else{
            i++;
        }
    }
    swap(&arr[l],&arr[sm_idx]);
    QuickSort(arr,l,sm_idx);
    QuickSort(arr,bg_idx,r);    
}
目录
相关文章
|
2月前
|
搜索推荐 C语言
【排序算法】快速排序升级版--三路快排详解 + 实现(c语言)
本文介绍了快速排序的升级版——三路快排。传统快速排序在处理大量相同元素时效率较低,而三路快排通过将数组分为三部分(小于、等于、大于基准值)来优化这一问题。文章详细讲解了三路快排的实现步骤,并提供了完整的代码示例。
62 4
|
2月前
|
存储 搜索推荐 Python
用 Python 实现快速排序算法。
快速排序的平均时间复杂度为$O(nlogn)$,空间复杂度为$O(logn)$。它在大多数情况下表现良好,但在某些特殊情况下可能会退化为最坏情况,时间复杂度为$O(n^2)$。你可以根据实际需求对代码进行调整和修改,或者尝试使用其他优化策略来提高快速排序的性能
128 61
|
3月前
|
算法 搜索推荐 Shell
数据结构与算法学习十二:希尔排序、快速排序(递归、好理解)、归并排序(递归、难理解)
这篇文章介绍了希尔排序、快速排序和归并排序三种排序算法的基本概念、实现思路、代码实现及其测试结果。
52 1
|
3月前
|
搜索推荐 Java Go
深入了解快速排序算法
深入了解快速排序算法
69 2
|
3月前
|
存储 搜索推荐 算法
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
|
3月前
|
算法 Python
Python算法编程:冒泡排序、选择排序、快速排序
Python算法编程:冒泡排序、选择排序、快速排序
38 0
|
3月前
|
搜索推荐 C语言 C++
【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)
【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)
|
5月前
|
搜索推荐 算法 Java
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
该博客文章通过UML类图和Java源码示例,展示了如何使用适配器模式将QuickSort类和BinarySearch类的排序和查找功能适配到DataOperation接口中,实现算法的解耦和复用。
57 1
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
|
5月前
|
算法 搜索推荐
算法设计 (分治法应用实验报告)基于分治法的合并排序、快速排序、最近对问题
这篇文章是关于分治法应用的实验报告,详细介绍了如何利用分治法实现合并排序和快速排序算法,并探讨了使用分治法解决二维平面上的最近对问题的方法,包括伪代码、源代码实现及时间效率分析,并附有运行结果和小结。
|
6月前
|
算法 搜索推荐 编译器
算法高手养成记:Python快速排序的深度优化与实战案例分析
【7月更文挑战第11天】快速排序是编程基础,以O(n log n)时间复杂度和原址排序著称。其核心是“分而治之”,通过选择基准元素分割数组并递归排序两部分。优化包括:选择中位数作基准、尾递归优化、小数组用简单排序。以下是一个考虑优化的Python实现片段,展示了随机基准选择。通过实践和优化,能提升算法技能。**
69 3

热门文章

最新文章