Algorithm 在最佳情况下,此选择排序代码是否在O(n)模式下工作?
我在互联网上到处搜索选择排序的最佳案例时间复杂度,即o(n^2)。但我编写并测试了下面的选择排序代码,它可以在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;
#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;i cout是的,您的算法的最佳运行时间为Θ(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)中工作