快速排序:
快速排序的基本思想是基于分治法的,在待排序的表中选取一个元素Pivot作为中心轴,将大于Pivot的元素放在右边,将小于Pivot的数字放在左边,则Pivot放在了最终的位置上,这个过程称为一次快速排序,分别对左右两个子序列重复上述操作(递归)
冒泡排序:
冒泡排序的基本思想是:从后往前(或从前往后)两两比较相邻元素的值,若为逆序(即A[i-1]>A[i]),则交换它们,直到序列比较完。我们称它为第一趟冒泡,结果是将最小的元素交换到待排序列的第一个位置 ( 或将最大的元素交换到待排序列的最后-一个位置),关键字最小的元素如气泡一般逐渐往上“漂浮”直至“水面”(或关键字最大的元素如石头一般下沉至水底)。下一越冒泡时,前一趟确定的最小元素不再参与比较,每趟冒泡的结果是把序列中的最小元素(或最大元素)放到了序列的…这样最多做n- 1趟冒泡就能把所有元素排好序。
直接插入排序:
直接插入排序是将表分为以排序字表和未排序子表。每次从未排序子表中取出表头元素按排序关系插入到已排序的字表中。当未排序子表为空时,排序完成。整个排序n-1趟
有序序列L[1…i-1] | L[i] | 无序序列L[i+1…n] |
---|
要将元素L(i)插入已有序的子序列L[1…i-1],需要执行以下操作(为避免混淆,下面用L[]表示一个表,而用L()表示一个元素):
1)查找出L(i)在[1…i-1]中的插入位置k。
2)将L[k…i-1]中的所有元素依次后移一个位置。
3)将L(i)复制到L(k)
折半插入排序:
采用折半查找的方法在有序区找到插入的位置
希尔排序:只适用于线性表为顺序存储的情况
希尔挂序的基本思想是:先将待排序表分割成若干形如L[i,i+d,i+2d,…i+kd]的“特殊”子表,即把相隔某个“增量”的记录组成一个子表,对各个子表分别进行直接插入排序,当整个表中的元素已呈“基本有序”时,再对全体记录进行一次直接插入排序。
希尔排序的过程如下:先取一个小于n的步长d1,把表中的全部记录分成d1组,所有距离为d1的倍数的记录放在同一组,在各组内进行直按插入排序:然后取第二个步长d2<d1,重复上述过程,直到所取到的dt= 1,即所有记录已放在同一组中, 再进行直接插入挂序,由于此对已经具有较好的局部有序性,故可以很快得到最终结果。到目前为止,尚未求得一个最好的增量序列,希尔提出的方法是d1=n/2,并且最后个增量等于1
简单选择排序:
假设排序表为L [i…n],第i趟排序即从L[i…n]中选择关键字最小的元素与L(i)交换,每一趟排序可以确定一个元素的最终位置,这样经过n- 1趟排序就可使得整个排序表有序。
堆排序:
基本思想:先把数组构造成一个大顶堆(父亲节点大于其子节点),然后把堆顶(数组最大值,数组第一个元素)和数组最后一个元素交换,这样就把最大值放到了数组最后边。把数组长度n-1,再进行构造堆,把剩余的第二大值放到堆顶,输出堆顶(放到剩余未排序数组最后面)。依次类推,直至数组排序完成。
堆排序的关键是构造初始堆。n个结点的完全二叉树,最后一个结点是第L⌊n/2」个结点的孩子。对第L⌊n/2⌋个结点为根的子树筛选(对于大根堆,若根结点的关键字小于左右孩子中关键字较大者,则交换),使该子树成为堆。之后向前依次对各结点(L⌊n/2」 - 1~1)为根的子树进行筛选,看该结点值是否大于其左右子结点的值,若不大于,则将左右子结点中的较大值与之交换,交换后可能会破坏下一级的堆,于是继续采用上述方法构造下一级的堆,直到以该结点为根的子树构成堆为止。反复利用上述调整堆的方法建堆,直到根结点。
归并排序:
“归并”的含义是将两个或两个以上的有序表组合成一个新的有序表。 假定待排序表含有n个记录, 则可将其视为n个有序的子表,每个子表的长度为1,然后两两归并,得到「n/27个长度为2或1的有序表:继续两两归…如此重复,直到合并成一个长度为n的有序表为止,这种排序方法称为2路归并排序。
对于N个元素进行K路归并排序,排序的趟数m满足:m=以k为底N的对数
基数排序:
最低有效位到最高有效位比较