无聊写排序之 ---- 快速排序(QuickSort) 非递归实现
来源:互联网 发布:怎么样让淘宝号升心快 编辑:程序博客网 时间:2024/06/05 11:44
前面讲了最常规的快速排序算法实现,常规实现中使用了递归进行不断分治递归出最后的区间,虽然书写容易,但是递归终究需要递归栈空间的支持,在数据量达到一定程度时,递归将进一步的限制算法的效率。这里我们将递归换做一个栈结构来替代实现非递归版本的快速排序。
code:
<span style="font-family:Comic Sans MS;font-size:14px;">// 划分区间 返回基准值的位置int Partition(int arr[], int left, int right){int key = arr[left];// 将一个数作为基准值int i = left, j = right;while(i < j){// 从最右边找第一个小于基准值的数字while(i < j && arr[j] >= key) j--;arr[i] = arr[j];// 放在基准值左边// 从最左边找第一个大于基准值的数字while(i < j && arr[i] <= key) i++;arr[j] = arr[i];// 放在基准值的右边}arr[i] = key; // 确定基准值的位置return i;// 返回基准值的位置}void QuickSort1(int arr[], int n){if (n <= 1) return;stack<int> SStack;// 将最大的区间压入栈SStack.push(0);SStack.push(n-1);int left, right, mid;while(!SStack.empty()){ // 注意按相反的顺序取出两边大小right = SStack.top();SStack.pop();left = SStack.top();SStack.pop();// 计算基准值的位置进行新子区间划分mid = Partition(arr, left, right);// 将左边新区间入栈if (mid-1 > left){SStack.push(left);SStack.push(mid-1);}//将右边新区间入栈if (mid+1 < right){SStack.push(mid+1);SStack.push(right);}}}</span>
根据排序过程中借助的主要操作,我们将内排序分为:插入排序、交换排序、选择排序和归并排序四类。之后介绍的七种排序法,就分别是各种分类的代表算法。其中:插入排序类(插入排序, 希尔排序);选择排序类(选择排序, 堆排序);交换排序(冒泡排序, 快速排序); 归并排序类(归并排序)
0 0
- 无聊写排序之 ---- 快速排序(QuickSort) 非递归实现
- 无聊写排序之 ---- 快速排序(QuickSort) 递归实现
- 无聊写排序之 ---- 归并排序(MergeSort) 非递归实现
- 无聊写排序之 ---- 归并排序(MergeSort) 递归实现
- 快速排序非递归实现
- 快速排序非递归实现
- 快速排序非递归实现
- 非递归实现快速排序
- 快速排序非递归实现
- 快速排序非递归实现
- 快速排序实现之递归与非递归
- 快速排序递归及非递归实现
- 快速排序实现(递归+非递归)
- 快速排序递归与非递归实现
- 快速排序之递归与非递归
- 快速排序----非递归
- 快速排序 非递归
- 非递归快速排序
- HDU-1029-Ignatius and the Princess IV
- vi使用
- 深入 char * ,char ** ,char a[ ] ,char *a[] 内核
- 日历1.0版本
- java 读取clob字段的几种方法
- 无聊写排序之 ---- 快速排序(QuickSort) 非递归实现
- Android Intent.FLAG_NEW_TASK详解,包括其他的标记的一些解释
- iOS开发中一些实用小代码。
- tomcat的安装、配置
- 维持ubuntu稳定的一个脚本
- android ProgressDialog与webview
- Java 8函数式接口functional interface的秘密
- ubuntu创建FTP服务器。
- 减负了,小学仅允许语数外期末考试