快速排序算法介绍

划分问题:把数组的各个元素重排后分成左右两个部分,使得左边任意元素都小于或等于右边任意元素。

递归求解:把左右两部分分别排序。

快速排序代码

#include <iostream>
using namespace std;
void swap(int & a,int & b)
{//交换变量a,b值int tmp=a;a=b;b=tmp;
}
void QuickSort(int a[],int s,int e)
{if(s>=e)return ;int k=a[s];int i=s,j=e;while(i!=j){while(j>i&&a[j]>=k) --j;swap(a[i],a[j]);while(i<j&&a[i]<=k) ++i;swap(a[i],a[j]);}//处理完后,a[i]=kQuickSort(a,s,i-1);QuickSort(a,i+1,e);
}
int a[]={93,27,30,2,8,12,2,8,30,89};
int main ()
{int size=sizeof(a)/sizeof(int);QuickSort(a,0,size-1);for(int i=0;i<size;++i){cout<<a[i]<<",";}cout<<endl;return 0;
}

快速选择问题

输入n个整数和一个正整数k(1<=k<=n),输出这些整数从小到大排序后的第k个,n<=107

分析

假设在快速排序的“划分”结束后,数组A[p……r]被分成了A[p……q]和A[q+1……r],则可以根据左边的元素个数q-p+1和k的大小关系只在左边或者只在右边递归求解。

代码

#include <iostream>
#include <algorithm>using namespace std;int qsort(int *a, int left, int right, int k) {//快速排序算法if (left > right) return 0;       //递归边界int centerV = a[left + (right - left) / 2];      //取标兵值int i = left, j = right;while (i <= j) {while (i <= j) {//从左往右扫描大于标兵值的元素,放在标兵值右侧if (a[i] >= centerV) break;i++;}while (j >= i) {//从右往左扫描小于标兵值的元素,放在标兵值左侧if (a[j] <= centerV) break;j--;}if (i > j) break;     //退出条件swap(a[i], a[j]);i++;j--;}if (k - 1 <= i)     //递归求左半解return qsort(a, left, j, k);else if (k - 1 > i + 1)       //递归求右半解return qsort(a, i, right, k);elsereturn a[k - 1];
}int QuickSort(int *pInt, int n, int k) {return qsort(pInt, 0, n - 1, k);
}int main() {int a[10] = {1, 2, 3, 4, 9, 33, 12, 8, 9, 10};int n = 10, k = 9;cout << "Before sorting: ";for (int i = 0; i < n; ++i) {cout << a[i] << ' ';}cout << endl;int ans = QuickSort(a, n, k);cout << "After sorting: ";for (int i = 0; i < n; ++i) {cout << a[i] << ' ';}cout << endl;cout << "Number " << k << " is: " << ans << endl;return 0;
}

排序算法 —— 快速排序相关推荐

  1. 排序算法 | 快速排序,算法的图解、实现、复杂度和稳定性分析与优化

    今天讲解一下快速排序算法的原理以及实现.复杂度和稳定性分析与优化 目录 1 快速排序的原理 2 快速排序代码实现 3 复杂度和稳定性分析.优化 4 习题练习 1 快速排序的原理 快速排序是所有内部排序 ...

  2. 排序算法 快速排序 python 0913

    排序算法 快速排序 python 0913 快速排序 思路 定义快排方法 接收参数:原始列表,起始位置,终止位置 判断是否符合快排条件,当起始下标与终止下标相等时,代表只有一个元素,无法排序,退出 一 ...

  3. 排序算法 快速排序【详细步骤图解】

    排序算法 快速排序[详细步骤图解] 快速排序 主要思想 图解 第一轮分割序列 第二轮分割序列 --- 左子序列 小结 第三轮分割序列 --- 右子序列 C++实现 总结 快速排序 给定一个序列:22 ...

  4. 【图解算法】排序算法——快速排序

    简介 首先还是得简单的介绍一下快速排序这个算法. 快速排序(Quicksort),又称划分交换排序(partition-exchange sort),一种排序算法,最早由东尼·霍尔提出.在平均状况下, ...

  5. JavaScript的排序算法——快速排序

    排序算法(Sorting algorithm)是计算机科学最古老.最基本的课题之一.要想成为合格的程序员,就必须理解和掌握各种排序算法. 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排 ...

  6. 十大经典排序算法-快速排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  7. 排序算法---快速排序(java版)

    快速排序 原理 快速排序(Quick Sort)算法,简称快排,利用的也是分治的思想,快排的思路是:如果要对 m->n 之间的数列进行排序,我们选择 m->n 之间的任意一个元素数据作为分 ...

  8. 实现快速排序的算法_排序算法-快速排序

    快速排序是由东尼霍尔所发展的一种排序算法.在平均n个项目要Ο(nlogn) 次比较.在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见.事实上,快速排序通常明显比其他 Ο(nlogn) 算法更 ...

  9. 排序算法--快速排序

    快速排序:快速排序(Quicksort)是对冒泡排序的一种改进.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部 ...

最新文章

  1. Acwing第 13 场周赛【未完结】
  2. 安装kibana,X-pack和elasticsearch插件的全过程
  3. 科大星云诗社动态20210414
  4. python设计一个函数定义计算并返回n价调和函数_音乐编程语言musicpy教程(第三期) musicpy的基础语法(二)...
  5. Jackson第一篇【JSON字符串、实体之间的相互转换】
  6. 神经网络模型中有什么样的算子_浅析图卷积神经网络
  7. 计算机专业想从事考古,考古专业一月工资多少 是冷门专业吗
  8. SQLi LABS Less-3 联合注入+报错注入
  9. taro更新页面数据_Taro 全局数据状态管理
  10. 腾讯音乐12月初赴美IPO,250亿美元被低估还是高估?
  11. 89c51单片机32个心形流水灯
  12. java输出华氏摄氏温度转换表_输出华氏-摄氏温度转换表
  13. 【操作系统】CPU调度算法
  14. Redis03-优惠券秒杀
  15. Carla中文版社区来了
  16. java写入excel文件,并填充空单元格颜色
  17. 详解Win10家庭版/专业版/企业版功能区别
  18. Blender - 法向 缩放 , Shrink Fatten 应用
  19. 关于zip包解压之后文件打开出现文件损坏的问题
  20. 抖音运营 | 10万赞的短视频如何打造?

热门文章

  1. codis 部署和测试
  2. SGU 183. Painting the balls( dp )
  3. Android UI开发第二篇——多级列表(ExpandableListView)
  4. java无效字符 怎么解决_java.sql.SQLException: ORA-00911: 无效字符 解决方法
  5. 平潭迁移库是什么意思_迁移学习》第四章总结---基于模型的迁移学习
  6. L2-1 简单计算器 (25 分)详解c语言 模拟堆栈
  7. C语言函数题-两对儿参数的交换
  8. java短横线转驼峰_Java后端常备的开发规范
  9. matlab中打不开保存好的模糊控制器,【求助大神】模糊控制器仿真,在Simulink运行时出现问题...
  10. 启动日志_Hybris服务器启动日志分析