排序——选择排序

基本思想:在数据中,每一趟(第i趟,i = 0,1,2,3…,n-2)在后面n-i个待排序的数据元素集合中选出关键码最小的数据元素,作为有序元素序列的第i个元素,待到第n-2趟做完,待排序元素集合只剩下1个元素,排序结束。

直接选择排序:得到一个待排序的元素集合,我们先默认第一个元素为最小元素,用min标记起来。在待排序元素集合中,依次比较大小,如果比min标记的元素小,就把min标记到小的哪一个元素。直到元素比完,找到最小的元素,然后与第一个元素交换位置。

void SelectSort(int *array,int size)
{
    int min = 0;
    for (int i = 0; i < size; i++)
    {
        min = i;
        for (int j = i; j < size; j++)
        {
            if (array[min] > array[j])
            {
                min = j;             //标记最小的元素
            }
        }
    std:swap(array[min], array[i]);
    }
}
void myprint(int *array,int size)
{
    for (int i = 0; i < size; i++)
    {
        cout << array[i]<<" ";
    }
    cout << endl;
}

int main()
{
    int array[] = { 5,6,8,2,3,1,9,7,0 ,4};
    int size = sizeof(array) / 4;
    SelectSort(array, size);
    myprint(array, size);
    return 0;
}

排序——选择排序_第1张图片
空间复杂度O(1) ;
时间复杂度O(n*n) ; 要排n个元素,每次比较n-1次,找到min,要n*(n-1)次才能排位
适用场景:数据规模小(n比较小)
稳定性:不稳定
直接排序优化:
一次找出min,max,把min,max分别与第left个元素,第right个元素交换,left >= right 时,排序结束。

void SelectSort_OP(int *array, int size)
{
    int left = 0;
    int right = size - 1;
    while (leftint min = left;
        int max = right;
        for (int i = left; i <= right; i++)
        {
            if (array[i] > array[max])
                max = i;
            if (array[i] < array[min])
                min = i;
        }
    std:swap(array[max], array[right]);
        if (min == right)       //考虑最小值在right的情况
            min = max;
    swap(array[min], array[left]);
    left++;
    right--;
    }
}

要排n个元素,排完需要经常 n(n-1)/2 次
时间复杂度:O(n*n)
排序——选择排序_第2张图片

你可能感兴趣的:(数据结构)