一直未曾真正理解排序。
这次把我理解的一小部分写下来吧。
冒泡排序有两层循环,第一层是用来计数的,就是第几次冒泡了;每冒泡一次,需要比较的数就少了一个,也就是比较次数少了一次,第二个循环可以理解为循环的次数,内层循环有两种写法,一种是从
就以需要比较n个数为例:
一、 for(int i=0;i<=n-2;i++){ for(int j=0;j<=n-2-i;j++){ int temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } 二、 for(int i=0;i<=n-2;i++){ for(int j=1;j<=n-1-i;j++){ int temp=a[j-1]; a[j-1]=a[j]; a[j]=temp; } } 第二个循环的范围是根据你接下来要写的数组下标有关,如果你用a[j]和[j+1],你可以用第一种; 如果你用a[j]和a[j-1],你可以用第二种。 还有一个问题就是那个<和<=,这个根据自己的习惯写,我个人习惯这种写法。
外循环,讲的是比较的次数;内循环讲的具体的比较,但是具体的比较受外循环比较次数的影响;
总共n个数,就需要进行n-1次比较,[0,n-2]共n-1次比较,对应的内层循环[0,n-1-i].
之前一直对内循环的范围变换有些晕乎乎的,现在一次性记下来。也方便自己以后复习。
最近学了一个不用临时变量交换两值的方法,就用上面的数组
a[j]=a[j]^a[j+1];
a[j+1]=a[j]^a[j+1];
a[j]=a[j]^a[j+1];
其原理是根据异或后的值与其中一个进行异或就会得到另一个。