比较型排序算法知识总结比较型排序算法知识总结
排序是算法中最基础的问题之一,经典的排序算法是前人不断总结得到的,基于比较的方法是比较直观的方
式,主要存在插入法排序、堆排序、增量排序、归并排序、快速排序,每一种排序算法都有自己的优缺点,比
如插入法排序适用于那些长度短的排序,对于长的表,有些爱莫能助啊,堆排序主要是依据了二叉堆的特性,
但是创建堆的过程也是一个复杂的问题,增量排序的过程是一个不断精确的过程,但是目前也只是一个经验方
式。
归并排序是一个递归的问题,采用分治的思想实现,但是这种算法需要额外的存储空间,快速排序虽然是实践中比较常用的算
法,但是对于有序的数组采用快速排序就是灾难。比较型算法的时间复杂度最优也只能到达O(NlogN)。
插入排序算法:该算法的复杂度为O(N^2),需要比对N-1趟,最坏情况下,每一趟比对的元素个数会随着i的增加而增加。比如
进行到了第k+1趟,实际上就是假设了前k个元素是有序的,这时候只需要将a[k+1]与a[k]比较,如果a[k+1]大于a[k]则说明
a[k+1]是目前最大的数,如果a[k+1] < a[k].这时说明a[k]的位置不对,需要往后移动,也就是a[k+1]中保存a[k]的值,可以将
a[k+1]的值与a[k]交换。然后比较a[k]与a[k-1],直到找到该元素的合适位置。
void insertSort(int *a, int size)
{
int i = 0, j = 0, tmp = 0;
for(i = 1; i < size; ++ i)
{
tmp = a[i];
for(j = i; j > 0 && tmp < a[j-1]; --j)
a[j] = a[j - 1];
a[j] = tmp;
}
}
增量排序(shell 排序):该算法的复杂度要略小于插入排序算法,但是也基本上认为是亚O(N^2)。实现的基本过程如下,选择
一个较大的增量gap,一般选择为数组长度的一般作为起始的增量。然后从当前增量作为起始下标开始访问,比较a[i]和a[i-
gap],如果a[i]<a[i-gap]则交换两个值,并令i = i - gap,交换完成以后接着比较a[i] < a[i-gap],直到 i < gap,因为a[gap] >
a[0],这是已经处理过的。如果a[i] > a[i-gap]则不处理。减小gap,一般去gap = gap/2。重新进行上面的操作,直到gap = 1,
因为这时候已经满足a[i]<a[i+1],实现了基本的排序操作。依据的基本关系式为a[i] < a[i + gap],这个关系式说明了a[i], a[i+gap],
a[i+2gap],a[i+3gap],…是一个有序的序列。
void shellSort(int *a, int size)
{
int i = 0, j = 0, gap = 0.
int tmp = 0;
/*选择合适的增量*/
for(gap = size / 2; gap > 0; gap /= 2 )
{
/*以增量为下标进行比较*/
for( i = gap ; i < size ; ++ i)
{
/*找到比较数的位置*/
tmp = a[i];
for(j = i; j >= gap && tmp < a[j - gap]; j -= gap)