冒泡排序

它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

void BubbleSort(int *a, size_t size){    assert(a);        for(int i = 0;i < size; i++)    {        for(int j = 0; j < size - i - 1;j++)        {            if(a[j] > a[j+1])            {                swap(a[j],a[j+1]);            }        }    }}

选择排序

工作原理:每一次从待排序的数据元素中选出最大或最小的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

void SelectSort(int* a, size_t size){    assert(a);    for (int i = 0; i < size; i++)    {        int min = i;        for (int j = i + 1; j < size; j++)        {        //选择最小元素            if (a[j] < a[i])            {                min = j;            }        }        //放在第i个位置        if (a[i] != a[min])        {            int tmp = a[i];            a[i] = a[min];            a[min] = tmp;        }    }}

堆排序

只需要

//升序void AdjustDown(int* a, size_t size, int root){    assert(a);    int child = root * 2 + 1;    while (child < size)    {        if (child + 1 < size && a[child + 1] > a[child])        {            child++;        }        if (a[child] > a[root])        {            swap(a[child], a[root]);            root = child;            child = root * 2 + 1;        }        else        {            break;        }    }}void AdjustUp(int* a, size_t size, int root){    assert(a);    int child = root * 2 + 1;    while (child < size)    {        if (child + 1 < size && a[child + 1] < a[child])        {            child++;        }        if (a[child] < a[root])        {            swap(a[child], a[root]);            root = child;            child = root * 2 + 1;        }        else        {            break;        }    }}void Heap_Sort(int* a, size_t size){    assert(a);        //建堆    for (int i = (size - 2) / 2; i >= 0; i--)    {        AdjustDown(a, size, i);    }    for (int j = size - 1; j > 0; j--)    {        swap(a[0], a[j]);        AdjustDown(a, j, 0);    }}void _Heap_Sort(int* a, size_t size){    assert(a);    for (int i = (size - 2) / 2; i >= 0; i--)    {        AdjustUp(a, size, i);    }    for (int j = size - 1; j > 0; j--)    {        swap(a[0], a[j]);        AdjustUp(a, j, 0);    }}