它只是将最大传递次数限制为数组O(n^2) 的大小通过递减和针对零进行测试一些编译器可能会利用使用的 CPU 架构并使用零标志而不是额外的 cmp 指令如果与0 以外的任何其他值进行比较,则需要。
例如;i<n;i++)可以翻译成:
inc i
cmp i,n
jc ???
而;i>0;i--)可以翻译成:
dec i
jnz ???
像往常一样(对于我在此站点上看到的任何冒泡排序),您的冒泡排序实现缺少停止条件,因此一旦对数组进行排序它就不会进行迭代,从而使其非常慢(总是通过n^2 迭代)。
我更习惯于这样的冒泡排序(C++):
template <class T> void sort_asc_bubble(T *a,int n)
{
int i,e; T a0,a1;
for (e=1;e;n--) // loop until no swap occurs
for (e=0,a0=a[0],a1=a[1],i=1;i<n;a0=a1,i++,a1=a[i])// proces unsorted part of array
if (a0>a1) // condition if swap needed
{ a[i-1]=a1; a[i]=a0; a1=a0; e=1; } // swap and allow to process array again
}
template <class T> void sort_dsc_bubble(T *a,int n)
{
int i,e; T a0,a1;
for (e=1;e;n--) // loop until no swap occurs
for (e=0,a0=a[0],a1=a[1],i=1;i<n;a0=a1,i++,a1=a[i])// proces unsorted part of array
if (a0<a1) // condition if swap needed
{ a[i-1]=a1; a[i]=a0; a1=a0; e=1; } // swap and allow to process array again
}
对不起,它在 C++ 中,但如果你摆脱模板并将 T 与使用的数据类型交换,你会再次得到 C。像这样的东西(只是在答案编辑器中重写,因此未经测试):
#define T int
void sort_asc_bubble(T *a,int n)
{
int i,e; T a0,a1;
for (e=1;e;n--) // loop until no swap occurs
for (e=0,a0=a[0],a1=a[1],i=1;i<n;a0=a1,i++,a1=a[i])// proces unsorted part of array
if (a0>a1) // condition if swap needed
{ a[i-1]=a1; a[i]=a0; a1=a0; e=1; } // swap and allow to process array again
}
void sort_dsc_bubble(T *a,int n)
{
int i,e; T a0,a1;
for (e=1;e;n--) // loop until no swap occurs
for (e=0,a0=a[0],a1=a[1],i=1;i<n;a0=a1,i++,a1=a[i])// proces unsorted part of array
if (a0<a1) // condition if swap needed
{ a[i-1]=a1; a[i]=a0; a1=a0; e=1; } // swap and allow to process array again
}
注意e 变量...因此,如果发生任何交换,则为真,如果在嵌套 for 循环完成后为假,则停止...这将使您的冒泡排序平均快得多。