C++实现快速排序
2015-06-18 08:17
351 查看
快速排序是一个递归的过程,只要能够实现一趟快速排序的算法,就可以利用递归的方法对一趟快速排序后的左右分区域分别进行快速排序。会时常出现面试和笔试题目中。
值得强调是:最好的情况是枢纽元素选取得当,每次都能均匀的划分序列。 时间复杂度O(nlogn),最坏情况是枢纽元素为最大或者最小数字,那么所有数都划分到一个序列去了 时间复杂度为O(n^2)。
排序思路:
源码:
值得强调是:最好的情况是枢纽元素选取得当,每次都能均匀的划分序列。 时间复杂度O(nlogn),最坏情况是枢纽元素为最大或者最小数字,那么所有数都划分到一个序列去了 时间复杂度为O(n^2)。
排序思路:
源码:
#include<iostream> using namespace std; template<class T> struct QuickSort { private: void swap(T &ra,T &rb) { T tmp; tmp = ra; ra = rb; rb = tmp; } void partition_dowhile(T *data,int len,int left,int right) // { if(data==nullptr||len<0||left<0||right>len) { cout<<"invalid parameter"<<endl; return; } int i_small = left; int i_big = right+1; if(i_small<i_big) { do { do //从左开始扫描 { i_small++; }while(i_small<right&&data[i_small]<data[left]); do { i_big--; }while(i_big>left&&data[i_big]>data[left]);//从右边开始扫描 if(i_small<i_big) { swap(data[i_small],data[i_big]); //交换 } }while(i_small<i_big); swap(data[left],data[i_big]); //交换枢纽数据 print(data,len); partition_dowhile(data,len,left,i_big-1); partition_dowhile(data,len,i_big+1,right); } } void partition_while(T *data,int len,int left,int right) { if(data==nullptr||len<0||left<0||right>len) { cout<<"invalid parameter"<<endl; return; } int i_small=left+1; int i_big=right; if(i_small<=i_big) { while(i_small<i_big) //从左边开始扫描 { while(i_small<right&&data[i_small]<data[left]) { i_small++; } while(i_big>left&&data[i_big]>data[left])//从右边开始扫描找 { i_big--; } if(i_small<i_big) { swap(data[i_small],data[i_big]); } } swap(data[left],data[i_big]);//交换枢纽数据 print(data,len); partition_while(data,len,left,i_big-1); partition_while(data,len,i_big+1,right); } } void partition_for(T *data,int len,int left,int right) { if(data==nullptr||len<0||left<0||right>len) { cout<<"invalid parameter"<<endl; return; } int i_small=left; if(left<right) { for(int index=left+1;index<=right;index++) { if(data[index]<data[left]) { i_small++; if(i_small!=index) { swap(data[i_small],data[index]); } } } this->swap(data[i_small],data[left]); print(data,len); partition_for(data,len,i_small+1,right); partition_for(data,len,left,i_small-1); } } public: void sort(T *data,int len) { if(data==nullptr||len<0) { cout<<"invalid parameter"<<endl; return; } partition_dowhile(data,len,0,len-1); this->print(data,len); } void print(T *data,int len) { cout<<"排序结果:"; for(int i=0;i<len;i++) { cout<<" "<<data[i]; } cout<<endl; } }; void main() { int data[10]={5,4,9,6,1,3,7,2,8,10}; QuickSort<int> quicksort; quicksort.sort(data,10); cin.get(); }
相关文章推荐
- QT编译遇到的初级问题整理 gnu-libstdc++\4.9\include\cstdlib:72: error: stdlib.h: No such file or directory
- 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用
- 在c语言中嵌入汇编语句,对于我来说相当难。
- C++中使用std::regex提取lrc歌词文件
- 【C++探索之旅】开宗明义+第一部分第一课:什么是C++?
- 【C++探索之旅】开宗明义+第一部分第一课:什么是C++?
- NotePad++与MinGw的第一次HelloWorld——C语言环境配置说明
- vs2013出现ISO C++ conformant解决办法
- C++静态变量对象的建立和删除,兼论MFC开始运行的起点(全局对象)
- C++字符串转化为数字的库函数
- mystring c++ 自己的string 封装
- c++关于结尾遇到‘\n’或其他特殊字符结束读取的问题(个人总结,大神勿喷)
- C++面试宝典(整理版)3
- Effective C++条款07解读:为多态基类声明virtual析构函数 (某公司招聘面试试题)
- 用Natvis定制C++对象在Visual Studio调试时如何显示
- 【学习笔记】【C语言】变量的内存分析
- 《Effective C++》学习笔记——条款32
- [转]100个经典C语言程序(益智类问题)
- C++--何时需要定义赋值/复制构造函数
- 树的简单c语言实现(先中后序遍历)