Author Archives: coder4

算法技术手册 – 排序 – 选择排序

选择排序,思想非常简单,分为selectMax和selectSort两个部分。

selectMax:
每次选择区间内最大的数,返回其Index
selectSort
1、从右到左依次扫描i(除idx=0,因为选到最后,最小的一定在最左边),规定区间为[0, i]
2、调用selectMax,获得最大的maxIndex。
3、这个i位置应该是第i大的数的位置,也就是maxIndex的数的位置,因此,如果i!=maxIndex,swap之。

算法复杂度,不管是最坏、平均还是最好[......]

继续阅读

算法技术手册 - 排序 - 快速排序

待补充:非递归版本。

快速排序和前面的中值排序非常类似。

分为partition和sort主体两个部分。

1.partition
和前面求第k大的数用到的思路非常类似。
(0)确定一个pivotIndex
(1)交换a[right]和a[pivotIndex]
(2)i=store=left,i从left到right-1,注意要包含right-1!!(不用包含right,因为里面是pivot)
(3)在(2)过程中,如果a[i] (4)完成上述步骤后,交换a[stor[......]

继续阅读

算法技术手册 - 排序 - 求第K大的数

借助刚才的划分算法,我们可以比较容易的求出第K大的数,平均性能为O(N),最坏可能是O(N^2)。

注意关于idx的选择,随机的话效果会比选left、right和median好,如果数据不是很特殊的化。
#include <stdio.h>

typedef int TYPE;

int cmp(TYPE a, TYPE b)
{
return a - b;
}

void swap(TYPE* a, TYPE* b)
{
TYPE tm[......]

继续阅读

算法技术手册 – 排序 – 划分

划分是求Kth、快速排序等的基础。

目标:一个数组array,给定一个pivotIndex,要求将array[pivotIndex]的对象至于storeIndex位置,使得[left,storeIndex)的元素都小于array[pivotIndex],而使得大于[storeIndex,right]的元素都大于等于array[pivotIndex]。

算法步骤:
1、交换array[pivotIndex]和array[right],记前者为pivot
2、用store表示pivo[......]

继续阅读