摘要:
归并排序(这里主要介绍二路归并)的基本思想是:将排序文件看成为 n 个长度为 1 的有序子文件,把这次子文件两两归并(二路归并),使得到 [n/2] 个长度为 2 的 有序子文件; 然后再把这[n/2] 个有序文件的子文件两两归并,如此反复,直到最后得到一个长度为 n的有序文件为止, 这种排序方法称为二路归并排序。 通过一个案例来说明其具体流程, 假设序列 为 : 125 11 22 34 15 44 76 66 100 8 14 20 2 5 1 共 15 个元素 初始状态: [125] [11] [22] [34] [15] [44] [76] [66] [100] [8] ... 阅读全文
摘要:
快速排序的基本思想是,通过一轮的排序将序列分割成独立的两部分,其中一部分序列的关键字(这里主要用值来表示)均比另一部分关键字小。继续对长度较短的序列进行同样的分割,最后到达整体有序。在排序过程中,由于已经分开的两部分的元素不需要进行比较,故减少了比较次数,降低了排序时间。 详细描述:首先在要排序的序列 a 中选取一个中轴值,而后将序列分成两个部分,其中左边的部分 b 中的元素均小于或者等于 中轴值,右边的部分 c 的元素 均大于或者等于中轴值,而后通过递归调用快速排序的过程分别对两个部分进行排序,最后将两部分产生的结果合并即可得到最后的排序序列。 “基准值”的选择有很多种方法。最简单的... 阅读全文
摘要:
冒泡排序就是将待排序的元素看作是排列的“气泡”,较小的元素比较轻,从而要往上浮。在冒牌排序算法中需要对这个“气泡”序列处理若干遍,所谓的一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻元素的顺序是否正确。如果发现两个相邻元素逆序,即“轻”的元素在下面,就交换它们的位置。现在处理一遍后,“最轻”的元素就浮到了最高的位置;处理第二遍的时候,“次轻”的元素就浮到了次高的位置。在做作第二遍的时候,由于最高元素已经是“最轻”的元素,所以不必检查。一般地,第i遍处理时,不必检查第i高位以上的元素,因为经过前面i -1 遍的处理,它们已经是正确地排好序。 冒泡排序相对比较简单,只介绍第一遍的... 阅读全文
摘要:
堆排序是另一种基于选择的排序方法。它是一种树形选择排序,利用了堆顶记录的关键字最大(或最小)这一特征,使得当前无序去中选取最大或(最小)关键字变得简单。 堆的定义:有n个元素组成的序列{k0,k1, k2, k3, ……, kn-2, kn-1},当且仅当满足关系: ki = k2i+1 且 ki >= k2i+2)其中i = 0,1,2,……,[(n/2]-1时,称之为堆。 例如序列{47, 35, 27, 26, 18, 7, 13, 19} 就满足上面的条件,这个序列就是一个堆。 若将堆看成是一棵以k0为根的完全二叉树,则,这棵完全二叉树的每个非终结点的值均不大于(或小于)其左、. 阅读全文
摘要:
选择排序的基本思想:每次从待排序的记录中选出关键字最小(或最大的)记录,顺序存放已经排序的记录序列的后面(或前面),直到全部排完。 同插入排序一样,分为有序段和无序段,不同的的是选择排序是从没有排好序段中找出最小(或最大)的元素添加在有序序列段后后面,这样子有序序列段不断边长,直至所有的序列均排好序。 实例分析:(红色表示已经有序段,黑色表示无序段,绿色表示刚被替换的元素) 初始状态: 70 30 40 10 80 20 90 100 75 60 45 共11个元素 第一次:10 30 40 70 80 20 90 100 75 60 45刚开始所有的序列均认为是无序的,... 阅读全文
摘要:
希尔排序是对直接排序插入排序算法的改进,又称为缩小增量排序。其基本思想是将待排序的记录分成几组,每组中元素都比原来的序列少,从而减少参与直接插入排序的数据量,在各组中分别进行直接插入排序。经过几次分组排序后,记录的排列已经基本有序,这个时候在对所有的记录实施直接排序。 具体步骤描述如下:假设待排序的记录为n个,先取整数 d#define MAX_NUM 80void shellsort(int* a, int n){ for(int d = n/2; d >= 1; d = d/2) { int guard = -1; for (int i = 0... 阅读全文