选择排序—选择排序和堆排序

插入排序—直接插入排序和希尔排序
https://mp.csdn.net/mdeditor/80358741

选择排序:

  • 选择排序
  • 堆排序

选择排序 :

思想:在一个无序数组中选择出每一轮中最值元素,然后把这一轮中最前面的元素和min交换,最后面的元素和max交换;然后缩小范围(开始位置(begin++)++,最后位置(end–)–),重复上面步骤,最终得到有序序列(升序)。

这里写图片描述

代码实现:

void SelectSort(int* a,size_t n)
{
    assert(a);
    int begin = 0;
    int end = n-1;
    while ( begin < end )
    {
        int min = begin,max = begin;
        for(int i = begin; i <= end; ++i)
        {
            if( a[min] > a[i] )
                min = i;
            if( a[max] < a[i] )
                max = i;
        }
        swap( a[min],a[begin] );
        if( max == begin )//如果首元素是最大的,则需要先把min 和 max的位置一换,再交换,否则经过两次交换,又回到原来的位置
            max = min;
        swap( a[max],a[end] );
        begin++;
        end--;
    }
}

堆排序 :

思想:
堆排序利用了大根堆(或小根堆)堆顶记录的关键字最大(或最小)这一特征,使得当前无序的序列中选择关键最大(或最小)的记录变得简单。(升序—建大堆,降序—建小堆)

代码实现:

void AdjustDown(int* a, size_t root, size_t n)
{
    size_t parent = root;
    size_t child = 2 * parent + 1;
    while (child < n)
    {
        if ((child + 1) < n && a[child + 1] > a[child])
        {
            ++child;
        }

        if (a[parent] < a[child])
        {
            swap(a[parent], a[child]);
            parent = child;
            child = 2 * parent + 1;
        }
        else
        {
            break;
        }
    }
}

void HeapSort(int* a, size_t n)
{
    assert(a);
    for (int i = (n - 2) / 2; i >= 0; --i)
    {
        AdjustDown(a, i, n);
    }

    size_t end = n - 1;
    while (end > 0)
    {
        swap(a[0], a[end]);
        AdjustDown(a, 0, end);
        --end;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_37941471/article/details/80372153