随笔分类 - 算法
摘要:归并排序:递归+合并。是经典算法——分治法的典型应用。思路:1)将一串数据,首先分成两部分,每个部分分别排序,然后合并成一串数据。2)在1)中,由于每个部分的数据并不是有序的,两个分串就需要再次分别分成两部分,这样的话就有了4个分串。3)一直往下分,直到分到每个部分只有一个数据,而一个数据必定是有序...
阅读全文
摘要:问题:a[]、b[]分别为有序排列的一个数组。现在要将a[]、b[]合并为c[]。例如:a[] = {1,3,4,7,10,15}; b[] = {2,5,8,20},我们需要得到的c[] = {1,2,3,4,5,7,8,10,15,20}.解决思路:1)先比较a[0]和b[0],如果a[0]相对...
阅读全文
摘要:上一篇完成了堆的建立。在此基础上就可以实现堆排序。思路:在此我们以实现从小到大排序为例。通过第一次的堆建立,生成的大顶堆的根结点值是最大值。然后我们将这个值放到某个地方可以不管它了(实际操作时都是放到整个堆的最后面,然后把最后面那个结点值放到最顶端),此时我们需要操作的元素个数已经少了一个,把剩下的...
阅读全文
摘要:一般采用数组a[n]来存储堆。首先要知道很重要的一点:当a[i]作为父结点的时候,其两个左右子结点为:a[2i+1]、a[2i+2];而当a[i]作为子结点时,其父结点为a[(i-1)/2](这个可以根据前面一条推算出来)。建一个新堆的过程:1)从最后一个父节点开始(下标为n/2-1),将其为根结点...
阅读全文
摘要:测试代码如下。/** @hushunfeng 希尔排序 从小到大排列*/#include//单次希尔排序,即一次直接插入排序//array为需要排序的数组//dk为希尔排序算法中的增量void shellInsert(int *array,int dk) { //--- ...
阅读全文
摘要:先上代码。/**** @author:hushunfeng** 直接插入排序 从小到大进行排列*/#includevoid insertSort(int *array,int arraySize) { //用于缓存被插入数 int temp; int i; in...
阅读全文
摘要:/**** @author:hushunfeng** 选择排序,从大到小排列*/#include//在所给数组的一段区间内计算出最大值//并得到其最大元素的下标int getMaxIndex(int array[],int k,int len) { //每一轮最大值所在的下标 i...
阅读全文
摘要:冒泡排序使用两个for循环实现,如果在循环的中途已经将序列排列好,则应跳出循环,避免无意义的操作。程序如下。/**** @author:hushunfeng** */#include#define bool int void swap(int *a,int *b) { int temp...
阅读全文
浙公网安备 33010602011771号