c++快速排序详解

 更新时间:2017年05月30日 23:45:37   作者:傻蜗牛  
快速排序总体思想:先找到一个枢轴,让他作为分水岭,通过一趟排序将待排序的记录分割成两部分,前面一部分都比枢轴小,后面一部分枢轴大,然后又分别对这两部分记录继续进行递归的排序,达到整个序列有序的目的

说一说快速排序

快速排序,实际中最常用的一种排序算法,速度快,效率高,在N*logN的同等级算法中效率名列前茅。· 

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

将数列变成上述形式,这一步很关键,做好这一步,才能对主元左右的部分进行递归调用。以下是实现这一部分的代码:

 int partition_sort(int arr[],int l,int r)//l是数组最左边,r为最右边 
 {
   int j=l;//设计标记 
   int t=arr[l];//设置主元 
 
   for(int i=l+1;i<=r;i++)
   {
     if(arr[i]<t){
       swap(arr[j+1],arr[i]);
       j++;
     }
   }
   
   swap(arr[l],arr[j]);
   return j;
 }

上述代码中,我把最左边的元素当作主元,这样的代码对大多数排序都很高效,但是不排除个别情况(当数组近乎有序或者当数组内有大量重复元素),这时,我们的排序算法相比于归并排序显得并不是那么高效,这和我们的排序算法原理密不可分,细细分析,当数组近乎有序时,我们的快速排序竟然退化到了O(n^2)级别,这显然是非常不高效的。

 要想实现上述不足的优化,我们可以将主元随机选择,或者采用其他方式的快速排序(双路快速排序,三路快速排序),本篇内容仅作为学习快排的基本思想和基本实现,不深入涉及,有兴趣的读者可阅资料了解。

下面是全部的实现代码:

 #include <iostream>
 #include <math.h>
 using namespace std;
 //实现函数,用于partition的递归 
 int partition_sort(int arr[],int l,int r)//l是数组最左边,r为最右边 
 {
   int j=l;//设计标记 
   int t=arr[l];//设置主元 
 
   for(int i=l+1;i<=r;i++)
   {
     if(arr[i]<t){
       swap(arr[j+1],arr[i]);
       j++;
     }
   }
   
   swap(arr[l],arr[j]);
   return j;
 }
 //实现递归的调用函数 
 void partition(int arr[],int l,int r)
 {
   if(l>=r)return ;
   
   int p=partition_sort(arr,l,r);
   partition(arr,l,p-1);
   partition(arr,p+1,r);
 }
 
 int main()
 {
   int a[5];
   for(int i=0;i<5;i++)
   {
     cin>>a[i];  
   } 
   partition(a,0,4);
   
   
   for(int i=0;i<5;i++)
   {
     cout<<a[i]<<" ";  
   } 
   return 0;  
 } 

相关文章

  • 二叉树先根(先序)遍历的改进

    二叉树先根(先序)遍历的改进

    这篇文章主要介绍了二叉树先根(先序)遍历的改进,有需要的朋友可以参考一下
    2014-01-01
  • C语言数据结构旋转链表的实现

    C语言数据结构旋转链表的实现

    这篇文章主要介绍了C语言数据结构旋转链表的实现的相关资料,这里提供实例帮助大家实现这样的功能,需要的朋友可以参考下
    2017-08-08
  • C++名称空间特性

    C++名称空间特性

    这篇文章主要介绍了C++名称空间特性,文章围绕C++名称空间特性的相关资料展开详细内容,需要的小伙伴可以参考一下下文具体内容,希望对你的学习有所帮助
    2022-01-01
  • C++实现将输入的内容输出到文本文件

    C++实现将输入的内容输出到文本文件

    这篇文章主要介绍了C++实现将输入的内容输出到文本文件问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • C++实现map和set封装详解

    C++实现map和set封装详解

    欢迎阅读本指南,将带您深入了解C++中map和set的实现细节,本文将重点介绍如何使用C++标准库中的容器来优化代码,同时提供实用的示例和技巧,无论您是初学者还是资深开发者,本指南都将成为您掌握C++中map和set封装的有力助手,需要的朋友可以参考下
    2024-03-03
  • 如何在C++中调用python代码你知道吗

    如何在C++中调用python代码你知道吗

    这篇文章主要为大家介绍了C++中调用python代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • C++ 点(.)和箭头(->)运算符用法小结

    C++ 点(.)和箭头(->)运算符用法小结

    在C++中,点运算符(.)用于访问类的成员变量和成员函数,而箭头运算符(->)用于通过指针访问类的成员变量和成员函数,本文就来详细的介绍一下如何使用,感兴趣的可以了解一下
    2024-01-01
  • C++深入讲解初始化列表的用法

    C++深入讲解初始化列表的用法

    这篇文章主要介绍了C++成员初始化列表,除了可以使用构造函数对类成员进行初始化之外,C++还提供了另外一种初始化的方法,叫做成员初始化列表。下面来看看文章的详细吧,需要的朋友可以参考一下
    2022-04-04
  • C语言中带头双向循环链表基本操作的实现详解

    C语言中带头双向循环链表基本操作的实现详解

    无头单向非循环链表结构简单,一般不会单独用来存数据。而带头双向循环链表的结构较为复杂,一般用在单独存储数据。本文将介绍带头双向循环链表的基本操作,需要的可以参考一下
    2022-11-11
  • C++中volatile关键字及常见的误解总结

    C++中volatile关键字及常见的误解总结

    这篇文章主要给大家介绍了关于C++中volatile关键字及常见的误解的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-05-05

最新评论