数据结构——快速排序算法
来源:互联网 发布:淘宝摄影培训 编辑:程序博客网 时间:2024/05/18 17:01
今天来说一说快速排序:
基本思想:
- 任取一个元素 (如第一个) 为轴点
- 所有比它小的元素一律前放,比它大的元素一律后放,形成左右两个子表
- 对各子表重新选择中心元素并依此规则调整,直到每个子表的元素只剩一个
注意:
- 每一趟的子表的形成是采用从两头向中间交替式逼近法
- 由于每趟中对各子表的操作都相似,可采用递归算法
代码实现:
#include <iostream>using namespace std;//找到第一个轴点,以这个轴点为界,将待排序的数组划分为//[low,pivot),[pivot],(pivot,high]三部分int Partition(int a[], int low, int high){ if( low > high )//判断非法条件 return -1; int pivot = a[low];//将轴点默认为数组的第一个元素a[low](备份) while (low < high)//从数组的两端 交替地 向中间扫描 { while (low < high && pivot <= a[high])//在不小于pivot的前提下 { high--;//向左拓展右端子序列 } a[low] = a[high];//小于pivot的值归入左侧子序列 while (low < high && pivot >= a[low])//在不大于pivot的前提下 { low++;//向右拓展左端子序列 } a[high] = a[low];//大于pivot的的值归入右侧子序列 } a[low] = pivot;//将备份的轴点记录置于左、右子序列之间 return low;//返回轴点的下标}//快排算法(递归)void QuickSort(int a[], int low, int high){ if (high - low < 2)//只有一个值是默认有序的,不必再进行排序 { return; } int key = Partition(a,low,high);//找到轴点的下标 QuickSort(a,low,key-1);//递归进行排序。一旦找到轴点就可以确定这个轴点 QuickSort(a,key+1,high);//的位置就是排序后的的位置,所以不必再进行排序。}/*------测试代码------*/int main(){ //int a[] = {1,2,4,3,12,45,2,54,6,32,44}; int a[] = {21,21,54,6,3,44,5,5,65,33}; int La = sizeof(a)/sizeof(a[0]) - 1;//这里必须减一,因为数组下标是从0开始的,否则会造成数组越界 QuickSort(a,0,La); for (int i =0; i <= La; i++) { cout<<a[i]<<endl; } return 0;}
输出结果:
时间效率: O(nlog2n) —每趟确定的元素呈指数增加
空间效率: O(log2n)—递归要用到栈空间
稳 定 性: 不稳定 —可选任一元素为支点。
0 0
- 数据结构【排序算法】——快速排序
- 数据结构与算法——快速排序
- 数据结构——快速排序算法
- 数据结构与算法——快速排序
- 数据结构算法——快速排序
- 数据结构与算法——快速排序
- 【数据结构与算法】排序算法——快速排序
- 【数据结构与算法】排序算法——快速排序
- 【数据结构】——排序算法——2.2、快速排序
- 数据结构 — 快速排序
- [数据结构] 快速排序算法
- 数据结构-快速排序算法
- 数据结构--排序算法--快速排序
- 算法与数据结构——快速排序 Quick Sort
- 数据结构——快速排序原理及算法Java实现
- 数据结构与算法分析——快速排序
- 快速排序(quick sort)——数据结构与算法复习
- 《数据结构与算法分析(c描述》—— 快速排序
- Can't create handler inside thread that has not called Looper.prepare()解决办法
- vb.net机房收费系统重构——总结(二)软件工程文档1
- 手机吸费代理 高收费电话 电话群呼器
- 有关C#关键字new、override、virtual的总结
- java.util.concurrent包下的Fork/Join框架
- 数据结构——快速排序算法
- string.h文件中函数的详细用法
- Could not allocate CursorWindow size due to error -12 错误解决方法
- 五大常用算法——分治法,动态规划,回溯法,分支界限法,贪心算法
- python List append() vs. extend()
- could not initialize proxy - no Session错误解决
- C#之数据适配器:DataAdapter对象
- 解决Eclipse中运行WordCount出现 java.lang.ClassNotFoundException: org.apache.hadoop.examples.WordCount$Token
- 解决Android加载图片时内存溢出的问题