排列的学习资料-数据结构与算法
如果按排序过程中依据的不同原则对内部排序方法进行分类,大致可分为5类:插入排序、交换排序、选择排序、归并排序和分配排序;如果按排序过程中所需的工作量来区分,则可分为3类:
1、简单的排序方法,其时间复杂度为 O(n2)
2、改进的排序方法,其时间复杂度为O(nlog2n);
3、基数排序,其时间度为O(d*n)。
排序过程只有两种基本操作:比较记录和移动记录。
常用的基本排序算法有5种:
·插入排序(insertionsort),有直接插入排序、二分法插入排序、希尔(Shell)排序。
·交换排序(exchangesort),有冒泡排序、快速排序(分区交换排序)。
·选择排序(selectionsort) ,有直接选择排序、堆排序。
·归并排序(mergesort)
·分布排序(distributionsort),又称基数排序。
为了形象地解释每种排序算法是怎样工作的,让我们来看一看怎样用这些方法对桌上一付乱序的牌进行排序。牌既要按花色排序(依次为梅花、方块、红桃和黑心),还要按点数排序(从2到A)。
插入排序的过程为:从一堆牌的上面开始拿牌,每次拿一张牌,按排序原则把牌放到手中正确的位置。桌上的牌拿完后,手中的牌也就排好序了。
交换排序的过程为:
(1)先拿两张牌放到手中。如果左边的牌要排在右边的牌的后面(左边的花色或者点数比右边大),就交换这两张牌的位置。
(2)然后拿下一张牌,并比较最右边两张牌,如果有必要就交换这两张牌的位置。
(3)重复第(2)步,直到把所有的牌都拿到手中。
(4)如果不再需要交换手中任何两张牌的位置,就说明牌已经排好序了;否则,把手中的牌放到桌上,重复(1)至(4)步,直到手中的牌排好序。
选择排序的过程为:在桌上的牌中找出最小的一张牌,拿在手中;重复这种操作,直到把所有牌都拿在手中。
归并排序的过程为:把桌上的牌分为52堆,每堆为一张牌。因为每堆牌都是有序的(记住,此时每堆中只有一张牌),所以如果把相邻的两堆牌合并为一堆,并对每堆牌进行排序,就可以得到26堆已排好序的牌,此时每一堆中有两张牌。重复这种合并操作,就可以依次得到13堆牌(每一堆中有4张牌),7堆牌(有6堆是8张牌,还有一堆是4张牌),最后将得到52张的一堆牌。
分布排序(也被称作radix sort,即基数排序)的过程为:先将牌按点数分成13堆,然后将这13堆牌按点数顺序叠在一起;再将牌按花色分成4堆,然后将这4堆牌按花色顺序叠在一起,牌就排好序了。
二、为什么是n2 ,nlog2n 或 d*n?
排序的过程,实质就是一个插入的过程。
简单的排序算法就是把第n个数插入到其它(n-1)个数的过程。n个数共需要插入n(n-1)次,所以其时间复杂度不超过n2。
改进的排序算法基本思路是“分解”:选择一个恰当的关键字,把一个排序任务分解成两个小的排序任务。理想情况下,关键字总能把原来的排序任务分解成两组长度相等的排序任务。于是,在下一轮的排序中,只需要在本小组内进行比较(长度是上一轮的1/2)。这个过程相当于一棵倒过来的二叉排序树。根椐n个数据元素生成一棵二叉排序树,相当于进行n次在二叉排序树上插入一个新结点的操作,因而其时间复杂度不超过O(nlog2n)。
参考资料:C语言编程常见问题解答 Pauls S.R.Chisholm 等著 张芳妮 吕波译 清华大学出版社1996年版
范晨鹏
------------------
软件是一种态度
成功是一种习惯