标题:选择排序
选择排序的基本思想:选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法
【直接选择排序】:
- 在元素集合array[i]–array[n-1]中选择关键码最大(小)的数据元素
- 若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换
- 在剩余的array[i]–array[n-2](array[i+1]–array[n-1])集合中, 重复上述步骤,直到集合剩余1个元素
代码如下 ( 下面代码是一次循环同时挑选出最大和最小数, 并将其与左右交换 ):
| 1 | //选择排序 | 
完整代码如下:
 
 
 
//交换数据
void Swap(int *m, int *n)
{
    int tmp = *m;
    *m = *n;
    *n = tmp;
}
//选择排序
void SelectionSort(int *a, int len)
{
    int left = 0, right = len - 1;
    while (left < right){
        //max记录最大数的下标,min记录最小数的下标
        int max = left, min = left;
        for (int i = left; i <= right; i++){
            if (a[i]>a[max])
                max = i;
            if (a[i] < a[min])
                min = i;
        }
        Swap(&a[min], &a[left]);
        //如果最大数的下标在为left,证明要交换的最大数已经被
        //换到min小标所表示的位置,只需要将right和min位置交换即可
        if (max == left)
            Swap(&a[min], &a[right]);
        else
            Swap(&a[max], &a[right]);
        left++, right--;
    }
}
//向下调整
void AdjustDown(int *a, int parent, int len)
{
    assert(a);
    while (parent <= len / 2 - 1){
        int child = parent * 2 + 1;
        if (child + 1 < len)
            child = a[child] > a[child + 1] ? child : child + 1;
        if (a[child] > a[parent])
            Swap(&a[child], &a[parent]);
        parent = parent + 1;
    }
}
//堆排序
void HeapSort(int *a, int len)
{
    assert(a);
    for (int parent = len / 2 - 1; parent >= 0; parent--)
        AdjustDown(a, parent, len);
    int i = len-1;
    for (; i > 0 ; i--){
        Swap(&a[0], &a[i]);
        AdjustDown(a, 0, i);
    }
}
//打印数组
void PrintArray(int *a, int len)
{
    assert(a);
    for (int i = 0; i < len; i++)
        printf("%d ", a[i]);
    printf("\n");
}
int main()
{
    int a[] = { 58, 25, 49, 25, 16, 34 };
    SelectionSort(a, sizeof(a) / sizeof(int));
    //HeapSort(a, sizeof(a) / sizeof(int));
    PrintArray(a, sizeof(a) / sizeof(int));
    system("pause");
    return 0;
}