这是我和同学讨论的突发奇想,我觉得单循环无法解决循环链表排序问题,他认为可以,最后经过一段时间的辩论后,方案逐渐清晰,并且,我将其拓展到普通数组上。以下是代码实现:
#include<stdio.h>
int main(int argc, const char *argv[])
{
int arr[10] = {0,1, 2,3,4,5,6,7,8,9 }; //定义一个数组,里面的值随机排列,这边选择了与降序区别最大的升序数组
//遍历输出数组,作为对照
for(int i=0; i<10; i++)
{
printf("%d\t",arr[i]);
}
printf("\n");
int len = sizeof(arr)/aizeof(int); //求出数组长度
//进行常规冒泡排序的内循环(降序)
for (int i=0; i<len-1; i++)
{
if(arr[i]<arr[i+1])
{
//交换
arr[i] ^= arr[i+1];
arr[i+1] ^= arr[i];
arr[i] ^= arr[i+1];
}
if(i+1 == len-1) //当发现i即将满足不了循环条件时,充值i的值
{
i = -1; //因为接下来i会自增1,为了重置为0,故置为-1;
len--; //减少下一次的循环长度
}
}
//输出结果
for(int i=0; i<10; i++)
{
printf("%d\t",arr[i]);
}
return 0;
}
可以看出,虽然这个代码看似只用了一个for循环,但是其实本制上还是一个双循环,因为它所消耗的运算次数,其实与常规双循环冒泡排序是一样的。只是它很巧妙的在单个循环内,通过重置 i 的值与改变 len 的值,使这个单循环达到了双循环的表现效果,并没有什么实际意义(起码我没有发现)但是通过研究这个问题,到是丰富了我的学习生活,故我将其记录下来,留作回忆。
以上。