快速排序
来源:互联网 发布:中兴网络机顶盒怎么用 编辑:程序博客网 时间:2024/06/05 20:26
思路
给定一个待排序的序列,然后根据枢轴把该序列分为两个可能为空的子序列,该枢轴左边的元素都小于等于枢轴的元素,该枢轴右边的元素都大于等于该枢轴的元素。
递归实现
//快速排序int partion(int *array, int left, int right){int begin = left;//标记第一个节点 int end = right;//标记最后一个节点 int key = array[end];//end是一个坑 while (begin < end){while (begin < end && array[begin] <= key)//从左向右找 {begin++;}array[end] = array[begin];//end坑被填,begin有一个坑 while (begin < end && array[end] >= key)//从右向左找 {end--;}array[begin] = array[end];}array[end] = key;//end坑被填 return end;}void QuiteSortOne(int *array, int left, int right){if (left < right){int pTemp = partion(array, left, right);QuiteSortOne(array, left, pTemp-1);QuiteSortOne(array, pTemp + 1, right);}}
非递归实现
int partion(int *array, int left, int right){int begin = left;//标记第一个节点 int end = right;//标记最后一个节点 int key = array[end];//end是一个坑 while (begin < end){while (begin < end && array[begin] <= key)//从左向右找 {begin++;}array[end] = array[begin];//end坑被填,begin有一个坑 while (begin < end && array[end] >= key)//从右向左找 {end--;}array[begin] = array[end];}array[end] = key;//end坑被填 return end;}//快速排序非递归void QuiteSort(int *array, int left, int right){if (array == NULL || left < 0 || right < 0 || left >= right)return;stack<int> s;int idx = 0, jdx = 0, key = 0;s.push(right);//先压右s.push(left);//再压左while (!s.empty()){idx = s.top();//先标记左s.pop();//左出栈jdx = s.top();//标记右s.pop();//右出栈if (idx < jdx){key = partion(array, idx, jdx);if (key > idx){s.push(key - 1);s.push(idx);}if (key < jdx){s.push(jdx);s.push(key + 1);}}}}
阅读全文
0 0
- 快速排序
- 快速排序
- 快速排序
- 快速排序!
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- Java学习第十九天
- dd
- CSS中的单位
- java设计模式之单例模式
- SpringBoot创建MVC网站
- 快速排序
- 可视化CNN
- Unity3d 物体速度快直接穿透墙体没有发生碰撞怎么办?
- CAS 交互流程
- hbase 和 hive 学习
- 计算机网络通讯
- HDU 4614 线段树(区间更新)+二分
- hdu 4635(tarjan)
- 每日MySQL之013:TIMESTAMP和DATETIME列的自动初始化与自动更新