算法系列——选择排序(Selection Sort)

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。时间复杂度是O(n^2)。


在完全随机数组的条件下进行排序实验。

代码段一:

template<typename T>
void selectionSort(T arr[], int n)
{
    //arr为数组,n为长度
    //选择排序算法,每次选择剩余数据中最小的值
    for (int i = 0; i < n; i++)
    {
        for (int j = i+1; j < n; j++)
        {
            if (arr[i] > arr[j])
            {
                swap(arr[i], arr[j]);
            }
        }
    }
}
int main()
{
    int n = 10000;
    int* arr = Helper::generateRandomArray(n, 0, n);
    Helper::testSort("SelectionSort", selectionSort, arr, n);

    return 0;
}

这里写图片描述
实验可知,10000数据量的随机数组使用以上的选择排序,用时2.34s
这里写图片描述
100000数据量的随机数组使用以上的选择排序,用时145.393s。


代码段二:
尝试优化选择排序算法,使用一个整型变量,每次比较用该整型变量记录最小值的索引,取代每次比较交换值的操作,减少了算法的操作步骤,从而优化了算法的运行时间。

template<typename T>
void selectionSortProve(T arr[], int n)
{
    //arr为数组,n为长度
    //选择排序算法,每次选择剩余数据中最小的值
    for (int i = 0; i < n; i++)
    {
        int index = i;
        for (int j = i + 1; j < n; j++)
        {
            if (arr[j]<arr[index])
            {
                index = j;
            }
        }

        swap(arr[index], arr[i]);
    }
}
int main()
{
    int n = 10000;
    int* arr = Helper::generateRandomArray(n, 0, n);
    Helper::testSort("SelectionSort", selectionSort, arr, n);
    Helper::testSort("SelectionSortProve", selectionSortProve, arr, n); 

    return 0;
}

10000的数据量:
10000的数据量
100000的数据量:
这里写图片描述
可知,在同等数据量下,优化后的选择算法大大的快于优化前的选择算法。


在接近有序的数组的条件下进行排序实验。

未优化前的代码在10000的数据量下实验:

int main()
{
    int n = 10000;
    int* arr = Helper::generateNearlyOrderArray(n, 0, n, 10);
    Helper::testSort("SelectionSort", selectionSort, arr, n);
    return 0;
}

这里写图片描述
在100000的数据量100的混乱度下实验:
这里写图片描述


优化后的代码在10000的数据量下实验:
这里写图片描述
在10000的数据量100的混乱度下实验:
这里写图片描述
可见,在接近有序的情况下,两者的效率相差不大。

猜你喜欢

转载自blog.csdn.net/qq_40104617/article/details/82622160