各种排序算法
以上是shell排序
以上是冒泡排序
执行过程:
假设一个数组有n个元素,从数组的最左边开始,比较0号位置和1号位置元素的大小。如果0号元素大,就让两个元素交换。如果1号元素大,就什么也不做。然后右移一位,比较1号位置和2号位置元素的大小,和刚才一样,如果1号元素大,则交换。照这样依次比较下去,一直到数组的最右端。最大的元素已经被排在最右边了。因为在算法执行的时候,最大的数据项总是“冒泡”到数组的顶端,所以叫做冒泡排序。现在重新回到数组的最左端开始第二趟排序,过程与第一趟一样,只是不需要比较最后一个元素,它已经是最大的了。不断执行这个过程,知道所有的元素都排定。
以上是改进后的冒泡排序算法
以上是直接插入法排序
插入排序仍然需要O(N*N)的时间,但是在一般情况下,它要比冒泡排序快一倍,比选择排序还要快一点。
其过程是这样的:
假设数组有一部分元素已经排好了,此时有一个标记元素,在这个元素左边的所有元素已经是局部有序的了。这就是说这个元素的左边的那些数据项是按顺序排列的。然而这些数据项在数组中最终的位置并没有确定,因为当没有被排过序的元素要插入到他们中间时,他们的位置还要发生变动。局部有序在冒泡排序和选择排序中是不会出现的。现在将局部有序中最大的元素移动到标记元素所在的位置,次大的元素移动到原来最大元素所在的位置,依次类推。当把最后一个比标记元素还大的元素移动之后,移动过程停止,此时移位空出的位置,就是标记元素应该插入的位置。然后将标记右移一个位置,重复前面的过程,知道所有未排序的元素插入到局部有序列中合适的位置。
以上是快速排序
快速排序是最流行的排序算法,在大多数情况下,快速排序都是最快的,执行时间为O(N*logN)级。快速排序在本质上通过把一个数组划分为两个子数组,然后递归地调用自身为每一个子数组进行快速排序来实现的。
划分数组需要选择一个数据项作为枢纽,使得划分后左边子数组的数据项都小于枢纽,右边子数组的数据项都大于枢纽。为了简便可以选择数组最右端的数据项作为枢纽,划分完成之后,枢纽被插入到左右子数组之间的分界处,那么枢纽就落在排序之后的最终位置上了。选择最右端的数据项作为枢纽有时会使排序的效率低下,“三数据项取中”即选择第一个,最后一个以及中间位置数据项的中值作为枢纽更合适一些。
以这是简单选择法排序
选择排序改进了冒泡排序,将必要的交换次数从O(N*N)减少到O(N)。不过比较次数还是O(N*N)。然而,选择排序仍然为大记录量的排序提出了一个非常重要的改进,因为这些大量的记录需要在内存中移动,这就使得交换时间比起比较时间来更为重要。
其过程如下:
将数组中所有的数据项扫描一趟,从中选出最小的一个。最小的和数组的0号元素交换位置。现在最左端的数据项就是有序的了。再次扫描数组,从1号位置开始,还是找最小的,然后和1号位置的元素交换。这个过程持续到所有数据项排定。
以上是归并排序。
以上为堆排序的非递归算法。
以上为堆排序的递归算法
posted on 2009-09-17 12:48 Hibernate4 阅读(128) 评论(0) 编辑 收藏 举报