c++快速排序详解

作者&投稿:翠柄 (若有异议请与网页底部的电邮联系)
~

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

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

  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;

  }





java面试题详解(java面试题简书)
试想:如果一般面试者都写的冒泡排序,而你写的是快速排序\/堆排序,肯定能给面试官留下不错的印象。 2.面试流程? 1)让你自我介绍 2)问Java基础知识 3)问项目 4)情景问题,例如:你的一个功能上了生产环境后,服务器压力骤增,该怎么排查。 5)你有什么想问面试官的 3.面试常问的知识点? 1)集合相关问题(必...

算法图解 PDF 高清版
2.3 选择排序 25 2.4 小结 28 第3 章 递归 29 3.1 递归 29 3.2 基线条件和递归条件 32 3.3 栈 33 3.3.1 调用栈 34 3.3.2 递归调用栈 36 3.4 小结 40 第4 章 快速排序 41 4.1 分而治之 41 4.2 快速排序 47 4.3 再谈大O表示法 52 4.3.1 ...

归并排序详解
算法稳定性: 在归并排序中,相等元素的顺序不会改变,所以它是稳定的算法。 总结: 1)时间复杂度:O(nlogn) 2)空间复杂度:O(n) 3)稳定性:稳定 4)复杂性:较复杂 1)空间复杂度考虑:选择优先级为[堆排序>快速排序>归并排序]。 2)稳定性考虑:应选归并排序,堆排序和快速排序都是不稳定的。 3)平均排序速度考...

exp是什么意思 详解exp的含义和用法?
2. 在数学中,指数函数通常指的是自然对数的底数e的指数函数,即exp(x) = e^x。这个函数在微积分、概率论、微分方程等领域中都有广泛的应用。3. 在计算机科学中,指数函数常常被用来表示指数级时间复杂度的算法,如快速排序、哈希表等。4. 总之,指数函数作为一个数学符号和缩写,在各个领域中都有...

剖析std::sort函数设计,避免coredump
探讨STL函数std::sort的设计与使用,以避免程序中出现意外的coredump错误。std::sort函数设计剖析std::sort是STL库中的一个重要函数,它基于1996年Musser的内省排序算法,结合了插入排序、堆排序和快速排序的优点。核心是std::__sort函数,它在递归调用中展现了巧妙的设计。关键点理解标准要求:std::sort...

回调函数详解
想象一下,遇到这种复杂场景:当对不同类型的数组(如整型、浮点型、字符或结构体数组)排序时,如何保持灵活性?答案藏在C语言库函数qsort的内部机制中。这个函数接受一个排序方法的函数指针,让你在快速排序的逻辑中根据需要调用不同的比较函数。qsort的参数解析至关重要:它需要一个指向数组的指针、数组...

嵌入式Linux上的C语言编程实践的目录
7.6.4 qsort函数:利用快速排序法3.1.2 排列数组 1367.6.5 rand函数:产生随机数 1367.6.6 srand函数:设置随机3.1.2 数种子 1377.7 文件I\/O操作类相关函数 1377.7.1 fopen函数:打开文件 1387.7.2 fclose函数:关闭文件 1397.7.3 fgetc函数:从文件中读取3.1.2 一个字符 1397.7.4 fputc函数:将一指定字符3.1...

排序的拼音
注音:ㄆㄞ_ ㄒㄨ_繁体:排序 五笔:rhd oc 词性:动词 『排序』的意思及详解 词语解释 ⒈ 又称“分类”。按关键字大小递增或递减的次序,对文件中的全部记录重新排列的过程。是计算机程序设计中的一种重要运算。分内部排序和外部排序两大类。内部排序中常用的方法有插入排序、冒泡排序、快速排序、...

假期最全Python经典算法合集
排序之heap q模块详解 排序之python sorted性能分析 排序之快速排序算法 史上最全的python经典算法合集 排序算法的比较和选择 按照指定字母顺序排序 将一个整数分拆为若干整数和 判断一个数是否为素数的多种方法 将list中的数字组合成最小的整数 无向图最小生成树Kruskal算法 无向图最小生成树的Prim算法 LUA按照指...

Java通过几种经典的算法来实现数组排序
选择排序法是将数组的第一个数据作为最大或者最小的值,然后通过比较循环,输出有序的数组。插入排序是选择一个数组中的数据,通过不断的插入比较最后进行排序。下面我就将他们的实现方法一一详解供大家参考。<1>利用Arrays带有的排序方法快速排序 public class Test2{ public static void main(String[...

南山区13713705582: C++中的快速排序 -
晋栋珈力: 快速排序实际上就是分治之排序实际上是将复杂排序划分为多个子排序,对不同的子排序利用不同的算法以提高效率.数量大的采用二分排序,如果雷同元素多,可能会导致二分区间划不出来,则采用堆排序.前两种都是利用堆栈排序,开销还是...

南山区13713705582: 用快速排序法(C++)排序 从小到大排,最好能讲一下原理,谢谢啦 -
晋栋珈力: #include using namespace std;void swap(int& a,int& b) {int c;c=a;a=b;b=c; }void sort(int* a, int n)//快排函数,从小到大 {if(n<=1) return;if(n==2){if(a[1] swap(a[1],a[0]);return;}swap(a[0],a[n/2]);int t = *a;int* L=a+1;//从左向右走,遇到...

南山区13713705582: C++快速排序的算法 -
晋栋珈力: 从你要排序的数组中选取一个位置作为分界线,比如是中间的那个位置,现在你遍历这个数组,和你选择的这个数比较,如果比这个数大就放大他右边,小就放到左边,现在经过这次排列,整体来说肯定还不是有序的,但是可以肯定的是,你选择的那个分界线左边的任何一个数肯定比右边的小,也就是说只看左右他是有序的,但是左边的哪个区域和右边的那个区域里面还是无序的,接下来的任务就是排列左边和右边,简单地,根据上面的方法选择分界线,递归做,到什么时候结束呢,如果最终你发现一个区域里只有一个数了,那么肯定不需要排序了,所以就倒头了.希望你能理解.

南山区13713705582: c++ 快排的思想详细 -
晋栋珈力: 快速排序:快速排序的基本原理是划分.通过反复划分,将数组分解成一个个划分段,当每个划分段长度都不超过1时,数组排序完毕.开始时只有一个划分段,就是数组本身.下面介绍划分方法和实现步骤 快速排序划分方法:用一对下标表示...

南山区13713705582: c++快速排序法 -
晋栋珈力: int qpass(RecordYype r[],int left,int right)/*对记录数组r中的r[left]至r[right]部分进行一趟排序,并得到枢轴的位置,使得排序后的结果满足期之后(前)的记录的关键字均不小于(大于)枢轴记录*/ { x=r[left]; low=left; high=right; while(low<high) { ...

南山区13713705582: C++怎样实现数的排序 -
晋栋珈力: 把数存在数组中,然后把小的放在前面,大的放在后面. 那么就有很多种方法了. 1找小的放前面,第二个以后和第一个比小了就交换位置.也可以从最后一个开始找大的放后面. 2两头同时进行,鸡尾酒排序. 3快速排序,算法中有的. 其他排序要涉及一些稍微男的数据结构..

南山区13713705582: 快速排序c++代码 -
晋栋珈力: 随机生成N个整数显示,经过快速排序后输出排序后的结果.程序代码如下所示,仅供参考:(已通过编译运行,正确无误!)# include "stdio.h"# include "time.h"# include "stdlib.h"# define N 10 int partition(int a[],int low,int high){//快速...

南山区13713705582: C++ 快速排序 -
晋栋珈力: #include <iostream>#include <algorithm> using namespace std; void print(int*a, int n){ for(int i=0; i<n; i++){ cout << a[i] << ' '; } cout << endl; } void sort(int*a, int n){ for(int i=0; i<n-1; i++){ int k = i;//最小值的下标 for(int j=i; j<n; j++){ if(a[j]<a[k]) k = j; } ...

南山区13713705582: c++中,详细讲解一下选择排序法. -
晋栋珈力: 这是直接选择排序 void SelectSort(DataType a[],int n) { int i,j,small; DataType temp; for( i = 0; i < n - 1;i ++) { small = i; for (j = i+1; j < n; j++ ) if( a[j] < a[small] ) small = j; if ( small != i) { temp = a[i]; a[i] = a[ small]; a[small] = temp; } } } 还有堆排序也是选择排序,如果想要的话再来问,并加分,还可以给你测试主程序

南山区13713705582: 快速排序c++代码 -
晋栋珈力: #include "stdio.h"void QuickSort(int e[], int first, int end){ int i=first,j=end,temp=e[first]; while(i<...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网