写一下快速排序和堆排序,两个简单又神奇的算法

快速排序

void quick_sort(int array[], int begin, int end)
{
	if(end > begin)
	{
		int pivot = begin;
		int last_small = begin;
		int i = end;
		while(last_small != i)
		{
			if(array[i] <= array[pivot])
			{
				int temp = array[i];
				array[i] = array[++last_small];
				array[last_small] = temp;
			}
			else
				i--;
		}
		int tmp = array[pivot];
		array[pivot] = array[last_small];
		array[last_small] = tmp;
		quick_sort(array, begin, last_small - 1);
		quick_sort(array, last_small + 1, end);
	}
}

堆排序

void adjust_heap(int[], int, int);
void build_heap(int array[], int size)//build the max-heap
{
	for(int i = size - 1; i >= 0; i--)
	{
		adjust_heap(array, size, i);
	}
}
void adjust_heap(int array[], int size, int element)//adjust the max-heap
{
	int left = element * 2 + 1;
	int right = left + 1;
	while(right < size)
	{
		if(array[element] >= array[left] && array[element] >= array[right])
			return;
		if(array[left] >= array[right])
		{
			int tmp = array[left];
			array[left] = array[element];
			array[element] = tmp;
			element = left;
		}
		else
		{
			int tmp = array[right];
			array[right] = array[element];
			array[element] = tmp;
			element = right;
		}
		left = element * 2 + 1;
		right = left + 1;
	}
	if(left < size && array[left] > array[element])
	{
		int tmp = array[left];
		array[left] = array[element];
		array[element] = tmp;
	}
}
void heap_sort(int array[], int size)//heap sort
{
	build_heap(array, size);
	for(int i = size - 1; i > 0; i--)
	{
		int tmp = array[i];
		array[i] = array[0];
		array[0] = tmp;
		adjust_heap(array, i, 0);
	}
}
时间: 2024-10-17 14:56:24

写一下快速排序和堆排序,两个简单又神奇的算法的相关文章

David MacKay:用信息论解释 &#39;快速排序&#39;、&#39;堆排序&#39; 本质与差异

这篇文章是David MacKay利用信息论,来对快排.堆排的本质差异导致的性能差异进行的比较. 信息论是非常强大的,它并不只是一个用来分析理论最优决策的工具. 从信息论的角度来分析算法效率是一件很有趣的事,它给我们分析排序算法带来了一种新的思路. 运用了信息论的概念,我们很容易理解为什么快排的速度那么快,以及它的缺陷在哪里. 由于个人能力不足,对于本文的理解可能还是有点偏差. 而且因为翻译的困难,这篇译文有很多地方并没有翻译出来,还是使用了原文的句子. 所以建议大家还是阅读原文Heapsort

十大基础实用算法之快速排序和堆排序

快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来. 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists). 算法步骤: 1 从数列中挑出一个元素,称为 "基准"(pi

两种简单实现菜单高亮显示的JS类(转载)

两种简单实现菜单高亮显示的JS类 近期在写一个博客管理后台的前端,涉及在同一页面两种高亮显示当前菜单的需求.记得当年写静态页时,为了实现高亮都是在每个页面加不同的样式,呵.高亮显示我觉得对于web前端来说,是比较常用到的效果,正好此次又要用到,特地整理出我所写的两种高亮类. 其实思路很简单,第一种方法是通过遍历链接组的href值,通过indexOf判断href值是否被包含在浏览器当前url值中.此方法有一定局限,比如对于iframe内的菜单是不能这样判断的; 第二种方法适用范围更广一样,实现思路

快速排序、堆排序、归并排序比较

快速排序是二叉查找树(二叉查找树)的一个空间最优化版本.不是循序地把数据项插入到一个明确的树中,而是由快速排序组织这些数据项到一个由递归调用所隐含的树中.这两个算法完全地产生相同的比较次数,但是顺序不同.对于排序算法的稳定性指标,原地分区版本的快速排序算法是不稳定的.其他变种是可以通过牺牲性能和空间来维护稳定性的. 快速排序的最直接竞争者是堆排序(Heapsort).堆排序通常比快速排序稍微慢,但是最坏情况的运行时间总是O(n log n).快速排序是经常比较快,除了introsort变化版本外

统计学习基础(第二版)两种简单的预测方法:最小二乘和最近邻

2.3两种简单的预测方法:最小二乘和最近邻 在本节中我们详细讨论两种简单但有效的预测方法,使用最小二乘线性模型拟合和k最近邻预测.线性模型对结构做了大量的假设,但是可能会产生不准确的预测.K-最近邻对结构做了适当的假设,所以预测通常是精确但不稳定的. 2.3.1线性模型和最小二乘 在过去的30年中,线性模型一直是统计学的支柱,而且现在依然是我们最重要的工具之一.给定一个输入向量,通过以下模型来预测Y: 其中是截距,在机器学习中又叫做偏置,通常在X中包含一个常数变量1,在系数向量中包含是方便的.这

python 写一个scheme 解释器 (二)&mdash;&mdash;简单求值器内核

  这一篇开始正式完成求值器,首先本着一个基本原则: 先将整个流程实现,才逐步细化每个过程,最终扩充比较难的特性.   一. 词法分析 def tokenAnalysis(strings): return strings.replace('(',' ( ').replace(')',' ) ').split()     将字符串流按照空白字符分割成一个个子串,split 和 replace 函数的更多用法可以查阅python手册. 示例: (cons  1  2) 拆分结果:'(' 'cons'

Java 多线程编程两个简单的例子

/** * @author gao */ package gao.org; public class RunnableDemo implements Runnable{ @Override public void run() { // TODO Auto-generated method stub for(int i=0;i<10;i++){ System.out.println("新线程输出:"+i); } } public static void main(String []

java 程序执行输出有两种简单方式

java 程序执行输出有两种简单方式: 1. System.out.println("需要输出的内容"): 该方法可参看运行一个简单的Java程序 结果图: 2. System.out.print("需要输出的内容"): 1 public class HelloWorld 2 { 3 //Java程序的入口方法,程序将从这里开始运行 4 public static void main(String[] args) 5 { 6 //向控制台打印一条语句 7 Syste

Python写的网络爬虫程序(很简单)

Python写的网络爬虫程序(很简单) 这是我的一位同学传给我的一个小的网页爬虫程序,觉得挺有意思的,和大家分享一下.不过有一点需要注意,要用python2.3,如果用python3.4会有些问题出现. python程序如下: import re,urllib strTxt="" x=1 ff=open("wangzhi.txt","r") for line in ff.readlines(): f=open(str(x)+".txt&