数据结构算法(3)--排序

数据结构算法(3)--排序

总结并记录常见的几种排序算法.


稳定排序算法

Note:
稳定性是指当数组中有两个相同值的元素p和q ,其排序完成后q依旧在p右边。

(1)插入排序

说明:
插入排序在n较小且原始数组基本有序的情况下效果最佳。

//插入排序,稳定排序
void InsertSort(int a[], int n)
{
    int temp;
    for (int i = 1; i < n; ++i)
    {
        int j = i - 1;
        temp = a[i];
        while (j >= 0 && temp < a[j])//逆序
        {
            a[j + 1] = a[j];//后移
            --j;
        }
        a[j + 1] = temp;
    }
}

非稳定排序算法

(1)shell排序(以shell(2)为例)

说明:
shell为插入排序的变形
其基本思想为:

  • 先将序列转化为若干小序列,在这些小序列内进行插入排序;
  • 逐渐增加小序列的规模,同时减少小序列个数。使之更有序;
  • 最后对整个序列进行排序:扫尾直接进行插入排序。

但shell(2)的选取的增量(2的指数)间不互质,导致重复排序。常见的解决办法是使用shell(3)或Hibbard增量排序。
Hibbard增量:{2^k-1,2^(k-1)-1,...,7,3,1}

void ModInsSort(int array[], int n, int delta)
{
    int i, j;
    for (i = delta; i < n; i += delta)
        for (j = i; j >= delta; j -= delta)//已delta为步长向前寻找逆置位,对其进行调整
        {
            if (array[i] < array[j - delta])
                swap(array, j, j - delta);
            else
                break;
        }
}

//shell(2)排序
void shellSort(int a[], int n)
{
    int i, delta;
    for (delta = n / 2; delta > 0; delta /= 2)
        for (i = 0; i < delta; ++i)
            ModInsSort(&a[i], n - i, delta);
    ModInsSort(a, n, 1);//如果不能保证最后一个delta的间距为1,可加入
}

猜你喜欢

转载自www.cnblogs.com/willingtosmile/p/10587504.html