【发布时间】:2011-11-27 13:09:19
【问题描述】:
我“发明”了“新”排序算法。好吧,我知道我不能发明一些好的东西,所以我试图在维基百科上搜索它,但所有排序算法似乎都不是我的。所以我有三个问题:
- 这个算法叫什么名字?
- 为什么它很糟糕? (最佳、平均和最差时间复杂度)
- 我可以继续使用这个想法让它变得更好吗?
所以,我的算法的想法:如果我们有一个数组,我们可以计算排序元素的数量,如果这个数字小于长度的一半,我们可以反转数组以使其更有序。之后我们可以对数组的前半部分和后半部分进行排序。在最好的情况下,我们只需要 O(n) - 如果数组完全按好或坏的方向排序。我在评估平均时间复杂度和最差时间复杂度时遇到了一些问题。
C#代码:
public static void Reverse(int[] array, int begin, int end) {
int length = end - begin;
for (int i = 0; i < length / 2; i++)
Algorithms.Swap(ref array[begin+i], ref array[begin + length - i - 1]);
}
public static bool ReverseIf(int[] array, int begin, int end) {
int countSorted = 1;
for (int i = begin + 1; i < end; i++)
if (array[i - 1] <= array[i])
countSorted++;
int length = end - begin;
if (countSorted <= length/2)
Reverse(array, begin, end);
if (countSorted == 1 || countSorted == (end - begin))
return true;
else
return false;
}
public static void ReverseSort(int[] array, int begin, int end) {
if (begin == end || begin == end + 1)
return;
// if we use if-operator (not while), then array {2,3,1} transforms in array {2,1,3} and algorithm stop
while (!ReverseIf(array, begin, end)) {
int pivot = begin + (end - begin) / 2;
ReverseSort(array, begin, pivot + 1);
ReverseSort(array, pivot, end);
}
}
public static void ReverseSort(int[] array) {
ReverseSort(array, 0, array.Length);
}
P.S.:对不起我的英语。
【问题讨论】:
-
我们可以在数组的一部分长度
-
和Stooge sort不一样,但是味道一样。
-
它没有名字,因为它实际上并没有排序。考虑 (3, 1, 2, 0)。这翻转到 (0, 2, 1, 3)。您将其拆分为 (0, 2) 和 (1, 3) 并递归。每个子数组都已排序,因此您完成了。结果数组为(0, 2, 1, 3),未排序。
-
一旦两半按排序顺序(假设它们是),如何组合它们以使结果排序?
-
@nsinreal 我认为这更好,因为检查了排序数组。看我的回答。
标签: algorithm sorting time-complexity