Selection sort | Iterative & Recursive

来源:互联网 发布:洛枳扮演者晁然淘宝店 编辑:程序博客网 时间:2024/06/05 18:54

选择排序|迭代和递归

给定整数数组,使用选择排序算法排序。

选择排序是一种不稳定的就地排序算法,因为其简单性已知,并且在某些情况下,特别是在辅助存储器有限的情况下,它具有超过更复杂算法的性能优势。它可以实现为一个稳定的排序。它具有O(n2)时间复杂性,使其在大型列表上使用效率低下。在简单的平均情况O(n2)算法中,选择排序总是优于气泡排序,并且通常比类似的插入排序更差。

使用选择排序的最大优点是我们只需要最大n次交换(内存写入),其中n是输入的长度。另一方面,插入排序采用O(n2)个写入次数。如果存储器写入操作比存储器读取操作显着更昂贵,例如使用闪存,其中每个写入减少存储器的寿命,这可能非常重要。

怎么运行的?

这个想法是将数组分成两个子集 - 排序子列表和未排序的子列表。最初,排序的子列表是空的,未排序的子列表是整个输入列表。算法通过在未排序的子列表中找到最小(或最大,取决于排序顺序)元素,将其与最左边的未排序的元素交换(以排序顺序排列),并将子列表边界移动到右边一个元素。下面的例子解释一下 -

       3 5 8 4 1 9 -2i = 0 -2 5 8 4 1 9 3i = 1 -2 1 8 4 5 9 3i = 2 -2 1 3 4 5 9 8i = 3 -2 1 3 4 5 9 8i = 4 -2 1 3 4 5 9 8i = 5 -2 1 3 4 5 8 9

迭代C ++实现 -

#include <iostream>using namespace std; //对arr []执行选择排序 void selectionSort(int arr[], int n){ // run(n - 1)次    for (int i = 0; i < n - 1; i++)     {       //找到未排序子阵列中的最小元素[i..n-1]        //并与arr [i]交换        // and swap it with arr[i]        int min = i;        for (int j = i + 1; j < n; j++)        {               //如果arr [j]元素较少,那么它是新的最小值            if (arr[j] < arr[min])                min = j;    //更新min元素的索引        }         //使用arr [i]交换子阵列[i..n-1]中的最小元素        swap(arr[min], arr[i]);    }}//打印数组arr的n个元素的功能void printArray(int arr[], int n){    for (int i = 0; i < n; i++)        cout << arr[i] << " ";}// 主功能int main(){    int arr[] = { 3, 5, 8, 4, 1, 9, -2 };    int n = sizeof(arr) / sizeof(arr[0]);    selectionSort(arr, n);    printArray(arr, n);    return 0;}

输出

-2 1 3 4 5 8 9

递归C ++实现 -

#include <iostream>using namespace std;//递归函数对子阵列arr [i..n-1]执行选择排序subarray arr[i..n-1]void selectionSort(int arr[], int i, int n){ //找到未排序子阵列中的最小元素[i..n-1]    //并与arr [i]交换    int min = i;    for (int j = i + 1; j < n; j++)    {        //如果arr [j]元素较少,那么它是新的最小值        if (arr[j] < arr[min])            min = j;    //更新min元素的索引    }      //使用arr [i]交换子阵列[i..n-1]中的最小元素    互换(arr [min],arr [i]);    swap(arr[min], arr[i]);    if (i + 1 < n)        selectionSort(arr, i + 1, n);}//打印数组arr的n个元素的功能void printArray(int arr[], int n){    for (int i = 0; i < n; i++)        cout << arr[i] << " ";}// 主功能int main(){    int arr[] = { 3, 5, 8, 4, 1, 9, -2 };    int n = sizeof(arr) / sizeof(arr[0]);    selectionSort(arr, 0, n);    printArray(arr, n);    return 0;}

输出

-2 1 3 4 5 8 9

选择排序的最差和最佳情况时间复杂度为O(n2)。

使用的辅助空间是O(1)。

原创粉丝点击