冒泡排序
基本冒泡排序:
就是将数组中的元素两两进行对比,比出大小,按顺序进行交换,没有比出则不进行任何操作。这个算法是比较简单暴力的,但是不推荐使用,因为这种算法是时间消耗最多,同时也做了很多无用功。
void BubbleSort_first(SqList* L)
{
for (int i = 1; i <= L->length; i++)
{ //Array[0]用作存储数组长度,所以从i = 1开始
for (int j = 1; j <= L->length; j++)
{
if (L->Array[i] > L->Array[j])
{
swap(L, i, j); //交换L->Array[i]>L->Array[j]的位置
}
}
}
}
对于代码的解释好比下图:
是不是每层遍历都要把所有元素再次进行遍历,已经排好的位置的元素在接下来的几层遍历中又进行了无用的比较,所以说它的效率太低了,我们可以对它进行优化一下。
void BubbleSort_second(SqList* L)
{
for (int i = 1; i <= L->length; i++)
{ //Array[0]用作存储数组长度,所以从i = 1开始
for (int j = L->length - 1; j >= i; j--)
{
if (L->Array[j] > L->Array[j + 1])
{
swap(L, j, j+1); //交换L->Array[i]>L->Array[j]的位置
}
}
}
}
可能有人对for(int j = L->length-1;j >= i;j++)产生疑问(指代的是小白,大佬请忽略🌝),我们之前是从前往后遍历,这次只不过是换了一遍历开端,我们从尾部遍历,这样来看是不是有一种冒泡的感觉。并且我们对于i以前已经排序号的序列在此也不做比较了。
当然,还能够对这个冒泡排序继续优化,不过不是省略已经排好的元素在的步骤,而是对于未排序且已经按照预定的顺序排好的元素,这些步骤也可以省略,比如我们此时的数组为{3,2,1,4,5,6,7,8,9}从第4个元素位置开始后边的元素已经按照从小到大的顺序拍好了,我们是不是也可以省略其步骤。
void BubbleSort_third(SqList* L)
{
int flag = TRUE;
for (int i = 1; i <= L->length && flag; i++)
{ //Array[0]用作存储数组长度,所以从i = 1开始
flag = FALSE;
for (int j = L->length - 1; j >= i; j--)
{
if (L->Array[j] > L->Array[j + 1])
{
swap(L, j, j+1); //交换L->Array[i]>L->Array[j]的位置
flag = TRUE;
}
}
}
}
不过对于以上的时间复杂度都为O(n²),并不是说三种算法不还是一样的,毕竟能减少一点对于你来说来说不算什么,但是对于计算机来说,假如有个千万级的数据需要排序,恐怕电脑不是冒烟就是在冒烟的路上,好了,以上是我对于冒泡排序的见解,如果还有更好的算法,欢迎来交流~