排序算啊之选择排序

来源:互联网 发布:海文网络班班代 编辑:程序博客网 时间:2024/06/06 00:53

工作原理:
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n - 1次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。
选择排序

void SelectSort(int *arr, int size){    assert(arr);    int index = 0;    for (int i = 0; i < size - 1; i++)    {        index = i;        for (int j = i+1; j < size; j++)        {            if (arr[index]>arr[j])            {                index =j;            }        }        if (i != index)        {            swap(arr[i], arr[index]);        }    }}

堆排序:

排序步骤:
(1)最大堆调整:将堆的末端子节点作调整,使得子节点永远小于父节点。
(2)创建最大堆:将堆所有数据重新排序。
(3)堆排序:移除位在第一个数据的根节点,并做最大堆调整的递归运算。

//调堆(大堆)void AdjustDown(int *arr, int size, int parent){    int child = parent * 2 + 1;    while (child < size)    {        if (child + 1 < size && arr[child] < arr[child + 1])        {            ++child;        }        if (arr[parent] < arr[child])        {            swap(arr[parent], arr[child]);            parent = child;            child = parent * 2 + 1;        }        else        {            break;        }    }}//堆排序void HeapSort(int *arr, int size){    //建堆    for (int i = (size - 2) / 2; i >= 0; i--)    {        AdjustDown(arr, size, i);    }    for (int i = size - 1; i > 0; i--)    {        swap(arr[0], arr[i]);        AdjustDown(arr, i, 0);    }}
0 0
原创粉丝点击