0
我已阅读来源说,对于选择的时间复杂度的排序是:优化选择排序?
- 最好的情况:为O(n^2)
- 平均情况:为O(n^2)
- 最差 - 案例:为O(n^2)
我想知道如果它是值得通过添加的代码的特定行来使算法“短路”本身,如果“优化”的算法其余部分已经排序。
下面是用C语言编写的代码:
我还添加了一个注释这表明该行是“优化”部分的一部分。
void printList(int* num, int numElements)
{
int i;
for(i = 0; i < numElements; i ++) {
printf("%d ", *(num + i));
}
printf("\n");
}
int main() {
int numElements = 0, i = 0, j = 0, min = 0, swap = 0, numSorted = 0;
printf("Enter number of elements: ");
scanf("%d", &numElements);
int* num = malloc(sizeof(int) * numElements);
for(i = 0; i < numElements; i ++) {
printf("Enter number = ");
scanf(" %d", num + i);
}
for(i = 0; i < numElements-1; i++) {
numSorted = i + 1; // "optimized"
min = i;
for(j = i + 1; j < numElements; j++) {
numSorted += *(num + j - 1) <= *(num + j); // "optimized"
if(*(num + min) > *(num + j))
min = j;
}
if (numSorted == numElements) // "optimized"
break;
if (min != i) {
swap = *(num + i);
*(num + i) = *(num + min);
*(num + min) = swap;
}
printList(num, numElements);
}
printf("Sorted list:\n");
printList(num, numElements);
free(num);
getch();
return 0;
}
我确实明白你的观点,但我很好奇的“优化”(如果是的话)是为了“短路”排序迭代。我们来考虑一下例子1,2,3,4,5。在常规的选择排序中,一步一步做1,2,3,4,5 - 1,2,3,4,5 - 1,2, 3,4,5 - 1,2,3,4,5。在我提交的代码中,它将简单地进行1,2,3,4,5的中断。 – CudoX
右键 - 但实际上多久会出现?在已经非常慢的算法中,这是额外的开销,并且在列表已经排序的极少数情况下只有一个优点。如果你的用例是某个列表经常被排序或者几乎排序的地方,那么使用排序算法,比如插入排序,自然地处理这个问题(并且作为一种奖励,同样擅长排序几乎排序的列表)。 – Chris