识别这种形式的排序算法并计算其时间复杂度
Identifying this form of sorting algorithm and calculating its time complexity
在尝试排序时,我想到了一种类似于某种插入排序的排序方式。
不同之处在于,在交换时,我不必比较从元素索引到索引 0 的元素(最坏情况)。
它也类似于分而治之的排序算法,因为它在同一数组中模拟已排序的扇区和未排序的扇区。
我的看法是,最初我会将当前元素指定为第一个元素。
然后我会将当前元素与下一个元素进行比较。如果电流更大,我交换元素。然后我递减以保持当前索引相同。
否则,我递增以推进当前索引。
这意味着我的电流永远是最新的参考值。比较的其他值总是较小且排序。
请参考代码:
#include<stdio.h>
void printArray(int *a, int l)
{
int i = 1;
printf("[%d", a[0]);
while(i < l)
{
printf(", %d", a[i]);
++i;
}
printf("]\n");
}
void whatSort(int *a, int l)
{
int i = 0;
int temp;
while(i < (l - 1))
{
if(*(a + i) > *(a + i + 1))
{
temp = *(a + i);
*(a + i) = *(a + i + 1);
*(a + i + 1) = temp;
--i;
}
else
{
++i;
}
}
}
int main(void)
{
//int array[] = {42, 18, 74, 2, 35, 92, 37, 25};
int array[] = {6, 5, 3, 1, 8, 7, 2, 4};
printArray(array, 8);
whatSort(array, 8);
printArray(array, 8);
return 0;
}
我很确定这种类型(双关语)已经存在,但我找不到名字。很高兴知道它叫什么。尽管如此,我只希望在计算此类代码的运行时复杂性方面得到帮助。这就是我想出的。任何帮助将不胜感激。
对于这种特殊情况,假设每个操作需要 1 个时间单位。
Declaration
Assignment
Declaration
Loop condition will run l - 1 times:
Comparison
Subtraction
Loop inside code will run l - 2 times:
IF statement:
Dereference
Addition
Comparison
Dereference
Addition
Addition
Assignment
Dereference
Addition
Dereference
Addition
Assignment
Dereference
Addition
Addition
Dereference
Addition
Addition
Assignment
Decrement
OR
ELSE statement:
Increment
最终,我想出了 O(n) 其中:
Worst case = 3 + [2 * (l - 1)] + [6 * (l - 2)] + [14 * (l - 2)]
O(22n - 39)
O(n)
Best case = 3 + [2 * (l - 1)] + [6 * (l - 2)] + (l - 2)
O(9n - 13)
O(n)
抱歉,没有比 O(n log n) 更好的排序算法,除非您对输入设置一些限制。
目前此代码无效。
例如,如果第一个元素大于第二个元素(在您的示例中就是这种情况),则 i
递减。最初 i=0
,所以现在 i=-1
。循环重新开始,您尝试访问 a[-1]
,并且发生分段错误。错误是
Then I decrement so as to keep current index same.
事实并非如此,正如您所说,索引会递减,因此不会保留该值。
This is the ouput
编辑:
即使纠正了这种情况,以下也不正确
Loop inside code will run l - 2 times:
该算法总是试图将第 (i+1) 个元素放到正确的位置,最坏的情况下将它带到第一个位置。
当index == 0
时,您最多交换一次。
当 index == 1
时,您最多进行两次交换。
当index == 2
时,你最多交换3次。
这种情况会发生,直到您到达数组的末尾。
所以,1x2x3x...x(n-1),即 O(n²)
在尝试排序时,我想到了一种类似于某种插入排序的排序方式。
不同之处在于,在交换时,我不必比较从元素索引到索引 0 的元素(最坏情况)。
它也类似于分而治之的排序算法,因为它在同一数组中模拟已排序的扇区和未排序的扇区。
我的看法是,最初我会将当前元素指定为第一个元素。 然后我会将当前元素与下一个元素进行比较。如果电流更大,我交换元素。然后我递减以保持当前索引相同。
否则,我递增以推进当前索引。
这意味着我的电流永远是最新的参考值。比较的其他值总是较小且排序。
请参考代码:
#include<stdio.h>
void printArray(int *a, int l)
{
int i = 1;
printf("[%d", a[0]);
while(i < l)
{
printf(", %d", a[i]);
++i;
}
printf("]\n");
}
void whatSort(int *a, int l)
{
int i = 0;
int temp;
while(i < (l - 1))
{
if(*(a + i) > *(a + i + 1))
{
temp = *(a + i);
*(a + i) = *(a + i + 1);
*(a + i + 1) = temp;
--i;
}
else
{
++i;
}
}
}
int main(void)
{
//int array[] = {42, 18, 74, 2, 35, 92, 37, 25};
int array[] = {6, 5, 3, 1, 8, 7, 2, 4};
printArray(array, 8);
whatSort(array, 8);
printArray(array, 8);
return 0;
}
我很确定这种类型(双关语)已经存在,但我找不到名字。很高兴知道它叫什么。尽管如此,我只希望在计算此类代码的运行时复杂性方面得到帮助。这就是我想出的。任何帮助将不胜感激。
对于这种特殊情况,假设每个操作需要 1 个时间单位。
Declaration
Assignment
Declaration
Loop condition will run l - 1 times:
Comparison
Subtraction
Loop inside code will run l - 2 times:
IF statement:
Dereference
Addition
Comparison
Dereference
Addition
Addition
Assignment
Dereference
Addition
Dereference
Addition
Assignment
Dereference
Addition
Addition
Dereference
Addition
Addition
Assignment
Decrement
OR
ELSE statement:
Increment
最终,我想出了 O(n) 其中:
Worst case = 3 + [2 * (l - 1)] + [6 * (l - 2)] + [14 * (l - 2)]
O(22n - 39)
O(n)
Best case = 3 + [2 * (l - 1)] + [6 * (l - 2)] + (l - 2)
O(9n - 13)
O(n)
抱歉,没有比 O(n log n) 更好的排序算法,除非您对输入设置一些限制。
目前此代码无效。
例如,如果第一个元素大于第二个元素(在您的示例中就是这种情况),则 i
递减。最初 i=0
,所以现在 i=-1
。循环重新开始,您尝试访问 a[-1]
,并且发生分段错误。错误是
Then I decrement so as to keep current index same.
事实并非如此,正如您所说,索引会递减,因此不会保留该值。
This is the ouput
编辑:
即使纠正了这种情况,以下也不正确
Loop inside code will run l - 2 times:
该算法总是试图将第 (i+1) 个元素放到正确的位置,最坏的情况下将它带到第一个位置。
当index == 0
时,您最多交换一次。
当 index == 1
时,您最多进行两次交换。
当index == 2
时,你最多交换3次。
这种情况会发生,直到您到达数组的末尾。 所以,1x2x3x...x(n-1),即 O(n²)