<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>一花一世界 &#187; 交换排序</title>
	<atom:link href="http://www.juliuschen.com/archives/tag/%e4%ba%a4%e6%8d%a2%e6%8e%92%e5%ba%8f/feed" rel="self" type="application/rss+xml" />
	<link>http://www.juliuschen.com</link>
	<description></description>
	<lastBuildDate>Mon, 17 Oct 2011 10:30:11 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>快速排序</title>
		<link>http://www.juliuschen.com/archives/11.html</link>
		<comments>http://www.juliuschen.com/archives/11.html#comments</comments>
		<pubDate>Sun, 20 Dec 2009 07:50:37 +0000</pubDate>
		<dc:creator>Julius Chen</dc:creator>
				<category><![CDATA[Sorting]]></category>
		<category><![CDATA[交换排序]]></category>
		<category><![CDATA[快速排序]]></category>
		<category><![CDATA[排序算法]]></category>

		<guid isPermaLink="false">http://www.juliuschen.com/archives/11</guid>
		<description><![CDATA[快速排序是应用最广泛的排序算法，也是目前认为最好的一种内部排序方法（就平均时间而言）。它采用分治（divide-and-conquer）的策略，通过一趟排序将待排记录分割成独立的两个部分，使其中的一部分记录关键字均比另一部分记录关键字小（大），然后分别对两个部分继续进行排序，以达到整个序列有序。 快速排序的C/C++代码实现： 快速排序的平均时间复杂度为O(n㏒n)，相对于希尔排序，对于大（large）的随机顺序文件，快速排序比希尔排序快将近两倍。对于巨大（huge）文件，快速排序算法的性能是则是希尔排序的5~10倍。 快速排序在空间使用上需要一个小的辅助栈。对于快速排序来说，其最好的情况是每趟排序时都将待排序列均匀地分割成长度相接近的两个子序列，这样排序栈的最大深度将不超过㏒2n+1（完全二叉树深度），且如果都先对长度短的子序列进行排序，那么栈的最大深度还可降为O(㏒n)。但如果碰到最坏的情况，比如文件已经排好序时，那么快速排序所有的划分都将退化，这不仅意味着执行时间上将为n2/2，而且栈所需要的空间也将是n。这对大文件来说是不可接受的，因为它可能使程序因为缺少内存空间而非正常结束。 快速排序对于寻找一些数字的中间数也很有用，寻找一些数字的中间数与排序有关但又不是排序的重要应用。一个解决办法就是先将这些数字排序，再找到中间数。但采用基于快速排序的寻找可以做的更好，它能使所需运行时间达到线性。具体的介绍可以参考《算法I-IV》（Robert Sedgewick著）。 快速排序的改进版本 从C. A. R. Hoare发布快速排序的那一刻起，快速排序的改进版本就不断的涌现。比如对于上面的程序，就还可以再做两点改进：1. 为了避免最坏情况的发生，在选取Pivot元素的时候，可以采用“三者取中法”（median-of-three method），即取待排序列中的最左边元素、中间元素和最右边元素，对这三个数排序，然后取它们的中间元素作为Pivot。2. 由于递归实现中程序多次因为小的子序列而调用自身，这影响程序的运行效率。因此当子序列已经很小时，可以中止递归的执行。在递归完成的最后再统一对它们采取一次插入排序。因为此时的序列已基本有序，因而插入排序效率非常高。对于中止的子序列长度的取法，通常是5~25之间的值，一个比较好的值是9（参考《计算机程序设计艺术》 Donald E. Knuth著）。通常，对这两点的改进就可以有效提高快速排序20%~25%的效率。 竞争的排序算法 快速排序的最直接竞争者是堆排序（Heap Sort）。堆排序通常比快速排序稍微慢，但是最坏情况的执行时间总是O(n㏒n)。快速排序经常比较快，但最坏情况下时间复杂度却为O(n2)。此外快速排序空间的使用O(㏒n)也要比堆排序O(1)要高。 快速排序也与归并排序（Merge Sort）竞争，这是另外一种递归排序算法，它也有最坏情况O(n㏒n)执行时间的优势，并且归并排序是稳定的排序方法。归并排序的主要缺点是在最佳情况下仍需O(n)的额外辅助空间。]]></description>
		<wfw:commentRss>http://www.juliuschen.com/archives/11.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>简单排序方法</title>
		<link>http://www.juliuschen.com/archives/9.html</link>
		<comments>http://www.juliuschen.com/archives/9.html#comments</comments>
		<pubDate>Mon, 14 Dec 2009 15:03:55 +0000</pubDate>
		<dc:creator>Julius Chen</dc:creator>
				<category><![CDATA[Sorting]]></category>
		<category><![CDATA[交换排序]]></category>
		<category><![CDATA[冒泡排序]]></category>
		<category><![CDATA[排序算法]]></category>
		<category><![CDATA[插入排序]]></category>
		<category><![CDATA[直接插入排序]]></category>
		<category><![CDATA[简单选择排序]]></category>
		<category><![CDATA[选择排序]]></category>

		<guid isPermaLink="false">http://www.juliuschen.com/archives/9</guid>
		<description><![CDATA[简单的排序方法主要是指直接插入排序、冒泡排序和简单选择排序。他们都是稳定的排序方法，平均时间复杂度都为O(n2)，并且空间复杂度都为O(1)。 直接插入排序 直接插入排序（Straight Insertion Sort）是一种最简单的排序方法，它的基本操作是将一个记录插入到已排好序的有序表中，从而得到一个新的、记录数增1的有序表。直接插入排序的运行时间和数据原始排列顺序密切相关。对于已经排好序（或已几乎排好序）的数据，插入排序的效率会比较高。 直接插入排序的C/C++代码实现： 其中第6行在sort_array[0]处设置监视哨，避免在查找插入位置的过程中数组下标出界。 冒泡排序 冒泡排序（Bubble Sort）算法简洁，也很容易理解，因此经常被用来作为介绍排序算法的入门方法。但它对于除少数元素之外的数列排序很没有效率。在这三种简单排序算法当中也是最慢的一种（参考《算法I-IV（C++实现）》Robert Sedgewick著）。而且虽然它可以设置一个标志位以对某种情况下的排序效率进行改进（即判断文件是否已排好序，当其中一步已没有进行任何交换操作，即文件已排好序，就可以中断外部循环。这个改进可以提高冒泡排序对于已排好序的数据的运行效率），但是通常来说它的效率的提高还是比不上能中断内部循环的插入排序。 冒泡排序的C/C++代码实现： 这是已加了标志位的冒泡排序。 简单选择排序 简单选择排序（Simple Selection Sort）的执行过程如下，首先，选出数组中最小的项，将它与数组第一个成员交换位置。然后选出次小的项，将它与数组第二个成员交换位置。按这种方法一直下去，直到整个数组排序完。 简单选择排序有一个缺点就是它的运行时间和文件中已有的排序的关系很少，它对已排好序或各数据项都相同或随机排列的文件排序所花的时间基本相同。但简单选择排序对于某一类重要文件的排序效率要比其他方法好：对数据项比较大，键又比较小的文件。因为对这种文件排序，移动数据所花费的时间要比比较数据的时间大很多，而其他排序算法移动数据的步数都比选择排序要多（选择排序移动数据项的操作是在内部循环外执行的，所以交换的次数至多为n-1次（最后一个成员不需要交换）。但执行时间与n2成正比）。 简单选择排序的C/C++代码实现： 在这三个简单的排序方法当中，对小文件进行操作时，插入排序和选择排序的效率是冒泡排序的两倍。对于巨大的随机排列的文件，这些方法的效率都不高。 当排序文件的比较操作花费较大时，如比较的键是字符串类型，这时插入排序比其他两种方法效率都高，因为它使用的比较操作要少的多。当交换操作花费较大时，则选择排序效率最好。 当排序数据是倒序时，这三种排序算法里面选择排序效率最好。选择排序（n2/2次比较和n次交换，并且和输入数据无关），插入排序（一般情况下n2/4次比较和n2/4次半交换（移动），最坏情况下需要两倍的数量），冒泡排序（一般情况和最坏情况下都是n2/2次比较和n2/2次交换）。]]></description>
		<wfw:commentRss>http://www.juliuschen.com/archives/9.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- www.000webhost.com Analytics Code -->
<script type="text/javascript" src="http://analytics.hosting24.com/count.php"></script>
<noscript><a href="http://www.hosting24.com/"><img src="http://analytics.hosting24.com/count.php" alt="web hosting" /></a></noscript>
<!-- End Of Analytics Code -->

