Algorithm 在最佳情况下,此选择排序代码是否在O(n)模式下工作?

Algorithm 在最佳情况下,此选择排序代码是否在O(n)模式下工作?,algorithm,sorting,time-complexity,complexity-theory,selection-sort,Algorithm,Sorting,Time Complexity,Complexity Theory,Selection Sort,我在互联网上到处搜索选择排序的最佳案例时间复杂度,即o(n^2)。但我编写并测试了下面的选择排序代码,它可以在O(n)中工作以获得最佳情况(即数组已经排序)。请找出这个程序中的错误 这是我的代码: #include <bits/stdc++.h> using namespace std; /* Function to print an array */ void printArray(int arr[], int size) { int i; for (i = 0;

我在互联网上到处搜索选择排序的最佳案例时间复杂度,即o(n^2)。但我编写并测试了下面的选择排序代码,它可以在O(n)中工作以获得最佳情况(即数组已经排序)。请找出这个程序中的错误

这是我的代码:

#include <bits/stdc++.h>
using namespace std;
/* Function to print an array */
void printArray(int arr[], int size)
{
    int i;
    for (i = 0; i < size; i++)
        cout << arr[i] << " ";
    cout << endl;
}

void swap(int *xp, int *yp)
{
    int temp = *xp;
    *xp = *yp;
    *yp = temp;
}

void selectionSort(int arr[], int n)
{
    int i, j, max_idx;

    // One by one move boundary of unsorted subarray
    for (i = 0; i < n - 1; i++)
    {
        cout << endl;
        printArray(arr, n);

        // Find the minimum element in unsorted array
        max_idx = 0;
        int count = 0;
        for (j = 1; j < n - i; j++)
        {
            if (arr[j] >= arr[max_idx])
            {
                max_idx = j;
                count++;
            }
        }

        if (count != n - i - 1)
        {   //swap only if not already sorted
            // Swap the found minimum element with the first element
            swap(&arr[max_idx], &arr[n - i - 1]);
        }
        else //already Sorted so returning
        {
            return;
        }
        //cout << "Sorted array: \n";
        printArray(arr, n);
    }
}

// Driver program to test above functions
int main()
{
    int arr[] = {2, 1, 4, 3, 6, 5, 8, 7};
    int n = sizeof(arr) / sizeof(arr[0]);
    selectionSort(arr, n);
    cout << "Sorted array: \n";
    printArray(arr, n);
    return 0;
}

// This is code is contributed by www.bhattiacademy.com
#包括
使用名称空间std;
/*函数打印数组*/
void printary(int arr[],int size)
{
int i;
对于(i=0;icout是的,您的算法的最佳运行时间为Θ(n),因为如果数组已经按升序排列,那么在外循环的第一次迭代中,
count
将等于
n-1
,因此算法将提前终止

您的算法与标准选择排序算法不同,后者如下所示:

for(int i=0;i

选择排序算法迭代搜索剩余的最小元素并将其交换到位。这不会产生检测数组已处于递增顺序的机会,因此没有机会提前终止,因此选择排序的最佳运行时间为Θ(n2).

是的,您的算法的最佳运行时间为Θ(n),因为如果数组已按升序排列,则在外循环的第一次迭代中,
count
将等于
n-1,因此算法将提前终止

您的算法与标准选择排序算法不同,后者如下所示:

for(int i=0;i

选择排序算法迭代搜索剩余的最小元素并将其交换到位。这不会产生检测数组已处于递增顺序的机会,因此没有机会提前终止,因此选择排序的最佳运行时间为Θ(n2).

选择排序:给定n个项目数组的想法 1.查找[0…n]范围内最大的项目x−1] 2.用(n)交换x−1) 第项 3.将n减少1并转至步骤1

选择排序函数可以使用以下算法编写有提示的代码:
选择排序:给定n个项目的数组 1.查找[0…n]范围内最大的项目x−1] 2.用(n)交换x−1) 第项 3.将n减少1并转至步骤1

选择排序函数可以使用以下算法编写有提示的代码:

Hmmm…只需使用一个已排序的小数组进行测试。您的解决方案将为O(n²),因为您没有提前停止的情况,请尝试添加一个。您的程序中的一个错误是它显示“最小元素”但实际上这是最大元素。另一个错误是编写您自己的
swap
函数,而不是只使用库提供的函数。@SidoShiro92他们没有提前停止的情况是什么意思?@SidoShiro92但这段代码会这样做。嗯……只需使用一个已排序的小数组进行测试。您的解决方案将是O(n²)因为您没有提前停止的情况,请尝试添加一个。程序中的一个错误是它显示“最小元素”但实际上这是最大的元素。另一个错误是编写自己的
swap
函数,而不是只使用库提供的函数。@SidoShiro92他们没有提前停止的情况是什么意思?@SidoShiro92但这段代码就是这样做的。这意味着可以修改选择排序(如上所述)使其最佳案例复杂性为O(n)。这只是一个小检查。可以,但这不是标准的选择排序算法。在实践中,维护计数器的额外操作在平均情况下会使其速度减慢太多,在数组已经排序的罕见情况下,它是值得的。如果您需要一个简单的二次时间排序算法,则可以使用插入排序一般来说,这是正确的选择。它的平均选择排序可以修改(如上所述),使其最佳的案例复杂性为O(n)。这只是一个小检查。可以,但这不是标准的选择排序算法。在实践中,维护计数器的额外操作在平均情况下会使其速度减慢太多,在数组已经排序的罕见情况下,它是值得的。如果您需要一个简单的二次时间排序算法,则可以使用插入排序一般来说,这是正确的选择。对于最佳情况(即已排序的数组),您能否使选择排序在O(n)中工作?对于最佳情况(即已排序的数组),您能否使选择排序在O(n)中工作