程序员的艺术:排序算法舞蹈

openkk 12年前
   <p>1.冒泡排序</p>    <p>冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第 1 个和第 2 个数,将小数放前,大数放后。然后比较第 2 个数和第 3 个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第 2 个数和第 3 个数的交换,使得第 1 个数不再小于第 2 个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。</p>    <p>由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。</p>    <p style="text-align:center;"> <object data="http://player.youku.com/player.php/sid/XMjU4MTg3MTU2/v.swf" width="600" height="450" type="application/x-shockwave-flash"></object></p>    <p style="text-align:left;">2.希尔排序</p>    <p style="text-align:left;">先取一个小于n的整数 d1 作为第一个增量,把文件的全部记录分成(n除以 d1)个组。所有距离为 d1 的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量 d2<d1重复上述的分组和排序,直至所取的增量 dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。</p>    <p style="text-align:left;">该方法实质上是一种分组插入方法。</p>    <p style="text-align:center;"> <object data="http://player.youku.com/player.php/sid/XMjU4NTcwMDIw/v.swf" width="600" height="450" type="application/x-shockwave-flash"></object></p>    <p style="text-align:left;">3.选择排序</p>    <p>每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。</p>    <p style="text-align:center;"> <object data="http://player.youku.com/player.php/sid/XMjU4NTY5NTcy/v.swf" width="600" height="450" type="application/x-shockwave-flash"></object></p>    <p style="text-align:left;">4.插入排序</p>    <p style="text-align:left;">有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外,而第二部分就只包含这一个元素。在第一部分排序后,再把这个最后元素插入到此刻已是有序的第一部分里的位置</p>    <p style="text-align:center;"> <object data="http://player.youku.com/player.php/sid/XMjU4NTY5MzEy/v.swf" width="600" height="450" type="application/x-shockwave-flash"></object></p>    <p style="text-align:left;"><br /> 5.快速排序</p>    <p style="text-align:left;">快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare 在 1962 年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。</p>    <p style="text-align:center;"> <object data="http://player.youku.com/player.php/sid/XMzMyODk4NTQ4/v.swf" width="600" height="450" type="application/x-shockwave-flash"></object></p>    <p style="text-align:left;">6.归并排序</p>    <p style="text-align:left;">归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。</p>    <p style="text-align:center;"> <object data="http://player.youku.com/player.php/sid/XMzMyODk5Njg4/v.swf" width="600" height="450" type="application/x-shockwave-flash"></object></p>