排序(1)

一. 冒泡排序:

规则:两两比较,大的向后移动,小的往前移动(像鱼吐的泡泡一样--所以叫冒泡排序)

时间复杂度: O(n^2)

空间复杂度: O(1)

稳定性: 稳定

void BubbleSort(int ar[], int len)
{
    assert(ar != NULL && len > 1);
    bool tag = true;
    for (int i = 0; i < len - 1; i++)//比较趟数
    {
        tag = true;
        for (int j = 0; j < len - i - 1; j++)//每一趟的比较次数  (j+1<len-i)
        {
            if (ar[j] > ar[j + 1])//若进行过交换,说明无序tag = false,若未交换过,说明此时已经有序.
            {
                int tmp = ar[j + 1];
                ar[j + 1] = ar[j];
                ar[j] = tmp;
                tag = false;
            }
        }
        if (tag)
        {
            break;
        }
    }
}

二. 直接插入排序(选择插入排序):
ps: 如果数组基本有序,就用直接插入排序,越有序时间复杂度越低,极端情况下时间复杂度为O(n)
时间复杂度 O(n^2)

空间复杂度 O(1)

稳定性: 稳定

void InsertSort(int ar[], int len)
{
    int tmp = 0;
    for (int i = 1; i < len; i++)
    {
        tmp = ar[i];
        if (ar[i-1] > tmp)
        {
            int j = i-1;
            for (; j >= 0; j--)//从后向前找
            {
                if (ar[j] > tmp)//如果大于tmp则向后移动
                {
                    ar[j + 1] = ar[j];
                }
                else  //否则退出
                {
                    break;
                }
            }
            ar[j + 1] = tmp;

        }
    }
}

三. 希尔排序(缩小增量排序):一种特殊的直接插入排序,只不过调用了直接插入排序

时间复杂度: O(n^1.3 - 1.5)

空间复杂度: O(1)

稳定性: 不稳定 ,进行了跳跃交换

static void Shell(int ar[], int len, int gap)//增量,间隔
{
    assert(gap >= 1);
    int tmp = 0;
    int j = 0;
    for (int i = gap; i < len; i++)// i 开始的位置
    {
        tmp = ar[i];
        if (ar[i - gap] > tmp)
        {
            for (j = i - gap; j >= 0; j -= gap)
            {
                if(ar[j] > tmp)
                {
                    ar[j + gap] = ar[j];
                }
                else
                {
                    break;
                }
            }
            ar[j + gap] = tmp;
        }
    }
}
void ShellSort(int ar[], int len)
{
    assert(ar != nullptr && len > 1);
    int dk[] = { 5,3,1 };//增量数组
    for (int i = 0; i < sizeof(dk) / sizeof(dk[0]); i++)
    {
        Shell(ar, len, dk[i]);
    }
}

未完待续...

 

posted @ 2021-04-10 20:12  Wz_qq_2***6  阅读(38)  评论(0)    收藏  举报