摘要: 思路:设R={r1,r2,..rn} 是要进行排列的n个元素,Ri=R-{ri}.集合X中元素的全排列记为perm(X);设(ri)perm(X)表示每一个全排列前加上前缀ri得到的排列.当n=1时,perm(R)=(r) 其中r是唯一的元素,这个就是出口条件.当n>1时,perm(R)由(r1)perm(R1),(r2)perm(R2),...(rn)perm(Rn)构成.程序如下:#include <stdio.h>void swap(int *a, int *b) { int m = *a; *a = *b; *b = m; } void perm(int list[] 阅读全文
posted @ 2011-08-07 23:17 jialejiahi 阅读(186) 评论(0) 推荐(0) 编辑
摘要: 堆排序堆排序是一种选择排序。是不稳定的排序方法。时间复杂度为O(nlog2n)。堆排序的特点是:在排序过程中,将排序数组看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲节点和孩子节点之间的内在关系,在当前无序区中选择关键字最大(或最小)的记录。基本思想1.将要排序的数组创建为一个大根堆。大根堆的堆顶元素就是这个堆中最大的元素。2.将大根堆的堆顶元素和无序区最后一个元素交换,并将无序区最后一个位置例入有序区,然后将新的无序区调整为大根堆。重复操作,无序区在递减,有序区在递增。初始时,整个数组为无序区,第一次交换后无序区减一,有序区增一。每一次交换,都是大根堆的堆顶元素插入有序区,所以有序 阅读全文
posted @ 2011-08-07 16:02 jialejiahi 阅读(230) 评论(0) 推荐(0) 编辑
摘要: 归并排序(MergeSort),又称合并排序.【工作原理】假如有7个记录,要对这7记录进行排序1、把它这些记录每组2个(最后一组有可能只有1个),一共4组2、分别把这4组排序好,再把这4组两两合并为1组,得到2组。3、在合并的同时排序,使得得到的合并的后的每组都是有序的4、将最后这两组合并成一组有序的序列。【正确性】归并排序是一个典型的分治合并算法,对一个大小的记录序列排序,可以把记录划分成2个记录序列,如果这两个子序列还是不能直接排序,则一真划分,直到序列剩下2个素或者1个元素。分治完毕后再依次两两,直至合并成一个有序表。 【算法5 - 1】合并算法,该算法与数据结构算法2.7是相同的v.. 阅读全文
posted @ 2011-08-07 14:39 jialejiahi 阅读(671) 评论(0) 推荐(0) 编辑