选择排序原理与实现:
从一组数中挑选最大一个放到尾部,除去最后一个以外的数据再次选择最大的放到尾部,以此类推。
例:
有以下几个数:3 7 4 2 6 1,请使用选择排序将他们从小到大排列
解:
第一趟:
3 7 4 2 6 1
在其中找到最大的元素7,然后将其和最后一个元素交换位置:
3 1 4 2 6 7

第二趟:
3 1 4 2 6 7
除了已经排好的7,在其中找到最大的元素6,然后将其和最后一个元素交换位置:
3 1 4 2 6 7

第三趟:
3 1 4 2 6 7
除了已经排好的6和7,在其中找到最大的元素4,然后将其和最后一个元素交换位置:
3 1 2 4 6 7

第四趟:
3 1 2 4 6 7
除了已经排好的4,6和7,在其中找到最大的元素3,然后将其和最后一个元素交换位置:
2 1 3 4 6 7

第五趟:
2 1 3 4 6 7
除了已经排好的3,4,6和7,在其中找到最大的元素2,然后将其和最后一个元素交换位置:
1 2 3 4 6 7
此时已经排序完毕
最终结果为:1 2 3 4 6 7
代码实现:

#include <stdio.h>
int FindMaxPos(int arr[], int m)
{
    int max = arr[0];
    int pos = 0;
    for (int i = 0;i < m;i++)
    {
        if (arr[i] > max)
        {
            max = arr[i];
            pos = i;
        }
    }
    return pos;
}

void SelectionSort(int arr[], int m)
{
    while (m > 1)
    {
        int pos = FindMaxPos(arr, m);
        int temp = 0;
        temp = arr[m - 1];
        arr[m - 1] = arr[pos];
        arr[pos] = temp;
        m--;
    }
}

int main( )
{
    int arr[6] = { 36,55,14,63,82,81 };
    SelectionSort(arr,6);
    for (int i = 0;i < 6;i++)
    {
        printf_s("%d", arr[i]);
    }
}

时间复杂度:
m + (m-1) + (m-2) +…+2=(m+2)*(m-1)/2
时间复杂度即为O(n2)

posted on 2021-11-11 11:50  LostDog  阅读(105)  评论(0)    收藏  举报