c/c++递归非递归完成快速排序思路解析

快排的基本步骤就是:

1:找基准数

2:把比基准数大的放一边,小的放另一边 (我的理解为:基准数找自己正确的位置)

3:以基准数为中心,左右两边重复1,2步

比喻理解:

              地点:学校操场             事件:班级第一次早操             人物:班主任    n个同学 和 不高不矮的我

广播响起,同学们都飞快的跑到操场上排成一字长蛇。班主任过来看我们排的不整齐就说:“矮的站前面,高的站后面,动起来,同学们”,此时站在最前面的我(基准数)率先动起来,开始往后面走,走的时候不忘提醒比我高的到我后面去,比我矮的到我前面去,然后我找到了正确的位置,我再也不用动了,同学们还在进行着交换位置。快排差不多就说这个原理。

333

递归和去递归实现:

#include<stdio.h>
#include<stack>
using namespace std;

void mySwap(int* sum, int low, int high)
{
	int tmpNum = sum[low];
	sum[low] = sum[high];
	sum[high] = tmpNum;
}

int arrange(int* sum, int low, int high)
{
	int tmpCompaNum = sum[low];        //基准数
	while (low < high)
	{
		while (low < high && sum[high] >= tmpCompaNum)
			high--;
		mySwap(sum, low, high);

		while (low < high && sum[low] <= tmpCompaNum)
			low++;
		mySwap(sum, low, high);
	}
	return low;
}

int qSort(int* sum, int low, int high)
{
	if (low >= high)
	{
		return 0;
	}

	int patonNum = arrange(sum, low, high);

	qSort(sum, low, patonNum - 1);  //分治
	qSort(sum, patonNum + 1, high);

	return 0;
}

int qiuckSort(int* sum, int len)
{
	if (sum == NULL)
	{
		return -1;
	}
	qSort(sum, 0,len - 1);
	return 0;
}

int QiuckSort2(int *sum, int len)    //用栈结构省去递归写法
{
	if (sum == NULL)
	{
		return -1;
	}
	stack<int> myStack;
	myStack.push(0);
	myStack.push(len - 1);
	while (myStack.size() > 0)
	{
		int high = myStack.top();
		myStack.pop();
		int low = myStack.top();
		myStack.pop();
		int patonNum = arrange(sum, low, high);

		if (low < patonNum - 1)
		{
			myStack.push(low);
			myStack.push(patonNum - 1);
		}
		if (patonNum + 1 < high)
		{
			myStack.push(patonNum + 1);
			myStack.push(high);
		}
	}
	return 0;
}

int main()
{
	int sum[10] = { 1,5,6,7,8,8,3,4,5 ,86};
	QiuckSort2(sum, 10);

	for (auto i : sum)
	{
		printf("%d\n", i);
	}

	getchar();
	return 0;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【内容简介】 本书可帮助读者: 通过由基于JAVA的演示所组成的可视专题讨论来掌握数据结构和算法 学会如何为常见和不太常见的编程条件选择正确的算法 利用数据结构和算法为现实世界的处理过程建模 了解不同的数据结构的优势和弱点,考虑如何利用它们改进编程的效率 学会如何用面向对象的编程简化数据结构和算法 本书以一种易懂的方式教授如何安排和操纵数据的问题,其中不乏一些难题;了解这些知识以期使计算机的应用获得最好的表现。 不管使用何种语言或平台,掌握了数据结构和算法将改进程序的质量和性能。 书中提供了一套独创的可视讨论专题用以阐明主要的论题;它使用JAVA语言说明重要的概念,而避免了C/C++语言的复杂性,以便集中精力论述数据结构和算法。 经验丰富的作者Robert Lafore先生提供了许多简单明了的例子,避免了对于这类命题常见的冗长、繁琐的数学证明。在第二版中,他利用Java语言最新特性,修改并扩充了他的例子。在每一章后都有问题和练习,使读者有机会测试自己的理解程序。 【原 书 名】 Data Structures & Algorithms in Java 【原出版社】 SAMS 【作  者】[美]Robert Lafore [同作者作品] [作译者介绍] 【译  者】 计晓云[同译者作品] 赵研 曾希 狄小菡 【丛 书 名】 国外经典计算机科学教材 【出 版 社】 中国电力出版社  【书 号】 7508319117 【出版日期】 2004年2月 【开 本】 16开 【页 码】 560 【版 次】2-1 本书以一种易懂的方式教授如何安排和操纵数据的问题,其中不乏一些难题;了解这些知识以期使计算机的应用获得最好的表现。不管使用何种语言或平台,掌握了数据结构和算法将改进程序的质量和性能。 书中提供了一套独创的可视讨论专题用以阐明主要的论题;它使用Java语言说明重要的概念,而避免C/C++语言的复杂性,以便集中精力论述数据结构和算法。 经验丰富的作者Robert Lafore先生提供了许多简单明了的例子,避免了对于这类命题常见的冗长、繁琐的数学证明。在第二版中,他利用Java语言最新特性,修改并扩充了他的例子。在每一章后都有问题和练习,使读者有机会测试自己的理解程序。 出版说明 献词 简介 第1章 综述 数据结构和算法能起到什么作用? 数据结构的概述 算法的概述 一些定义 面向对象编程 软件工程 对于C++程序员的Java Java数据结构的类库 小结 问题 第2章 数组 Array专题Applet Java中数组的基础知识 将程序划分成类 类接口 Ordered专题applet 有序数组的Java代码 对数 存储对象 大O表示法 为什么不用数组表示一切? 小结 问题 实验 编程作业 第3章 简单排序 如何排序? 冒泡排序 选择排序 插入排序 对象排序 几种简单排序之间的比较 小结 问题 实验 编程作业 第4章 栈和队列 不同的结构类型 栈 队列 优先级队列 解析算术表达式 小结 问题 实验 编程作业 第5章 链表 链结点(Link) LinkList专题Applet 单链表 查找和删除指定链结点 双端链表 链表的效率 抽象数据类型 有序链表 双向链表 迭代器 小结 问题 实验 编程作业 第6章 递归 三角数字 阶乘 变位字 递归的二分查找 汉诺(Hanoi)塔问题 归并排序 清除递归 一些有趣的递归应用 小结 问题 实验 编程作业 第7章 高级排序 希尔排序 划分 快速排序 基数排序 小结 问题 实验 编程作业 第8章 二叉树 为什么使用二叉树? 树的术语 一个类比 二叉搜索树如何工作 查找节点 插入一个节点 遍历树 查找最大值和最小值 删除节点 二叉树的效率 用数组表示树 重复关键字 完整的tree.java程序 哈夫曼(Huffman)编码 小结 问题 实验 编程作业 第9章 红-黑树 本章讨论的方法 平衡树和非平衡树 使用RBTree专题applet 用专题applet做试验 旋转 插入一个新节点 删除 红-黑树的效率 红-黑树的实现 其他平衡树 小结 问题 实验 第10章 2-3-4树和外部存储 2-3-4树的介绍 Tree234专题applet 2-3-4树的Java代码 2-3-4树和红-黑树 2-3-4树的效率 2-3树 外部存储 小结 问题 实验 编程作业 第11章 哈希表 哈希化简介 开放地址法 链地址法 哈希函数 哈希化的效率 哈希化和外部存储 小结 问题 实验 编程作业 第12章 堆 堆的介绍 Heap专题applet 堆的Java代码 基于树的堆 堆排序 小结 问题 实验 编程作业 第13章 图 图简介 搜索 最小生成树 有向图的拓扑排序 有向图的连通性 小结 问题 实验 编程作业 第14章 带权图 带权图的最小生成树 最短路径问题 每一对顶点之间的最短路径问题 效率 难题 小结 问题 实验 编程作业 第15章 应用场合 通过数据结构 专用数据结构 排序 图 外部存储 前进 附录A 运行专题applet和示例程序 专题applet 示例程序 Sun Microsystem软件开发工具集 重名的类文件 其他开发系统 附录B 进一步学习 数据结构和算法 面向对象程序语言 面向对象设计(OOD)和软件工程 附录C 问题答案 第1章,综述 第2章,数组 第3章,简单排序 第4章,栈与队列 第5章,链表 第6章,递归 第7章,高级排序 第8章,二叉树 第9章,红-黑树 第10章,2-3-4树和外部存储 第11章,哈希表 第12章,堆 第13章,图 第14章,带权图

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值